home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1999 #2 / Amiga Plus CD - 1999 - No. 2.iso / System-Boost / Grafik / picFX / e-source / picFX.e < prev   
Text File  |  1998-11-08  |  110KB  |  2,602 lines

  1. OPT PREPROCESS,LARGE,OSVERSION=39
  2. #define PlaneFuncObject NewObjectA(cl_planefunc.mcc_class,NIL,[TAG_IGNORE,0
  3. #define ProjectListObject NewObjectA(cl_projectlist.mcc_class,NIL,[TAG_IGNORE,0
  4. #define uSliderObject NewObjectA(cl_uslider.mcc_class,NIL,[TAG_IGNORE,0
  5. #define SizeTextObject NewObjectA(cl_sizetxt.mcc_class,NIL,[TAG_IGNORE,0
  6. #define MyApplicationObject NewObjectA(cl_myapp.mcc_class,NIL,[TAG_IGNORE,0
  7.  
  8. #define label(t) TextObject,MUIA_Text_Contents,t,MUIA_Text_SetMax,MUI_TRUE,End
  9.  
  10. #define modt(val) val AND $FF
  11.  
  12. #define PICVERSION 'PicFX alpha 0.84'
  13. #define FULLVERSION '$VER: PicFX alpha 0.85 (12/10/98)'
  14.  
  15. MODULE 'afc/super_picture','afc/trueBitmap',
  16.        'amigalib/boopsi','amigalib/lists',
  17.        'asl',
  18.        'dos/dos','dos/dosextens','dos/dostags',
  19.        'exec/lists','exec/memory','exec/nodes','exec/ports','exec/semaphores','exec/tasks',
  20.        'graphics/gfx','graphics/rastport','graphics/view',
  21.            'cybergraphics','picasso96api','libraries/picasso96',
  22.        'intuition/classes','intuition/classusr','intuition/intuition','intuition/screens',
  23.        'libraries/asl','libraries/gadtools','libraries/mui','libraries/muip',
  24.        'mui/muicustomclass',
  25.        'muimaster',
  26.        'utility','utility/tagitem',
  27.        '*parser','tools/longreal',
  28.        'mui/lamp_mcc','mui/SettingsWindow_mcc',
  29.        '*picFXlocale'
  30.  
  31. MODULE 'tools/debug' ->kputfmt(formatstring,[values])
  32.  
  33. CONST TICKS_PER_MINUTE = TICKS_PER_SECOND*60
  34.  
  35. DEF app,
  36.     messages_win,messages_lst,
  37.     prefs_win,mainpri_sld,renderpri_sld,renderupdate_sld,mui_btn,
  38.         currpri_sld,close_cyc,
  39.     settings_win,colour_txt,
  40.     opened_lsv,opened_lst,
  41.     new_btn,prefs_btn,
  42.     sgroup, /*settings gadgets*/
  43.     name_str,type_reg,
  44.         path_str,size_rad,size_txt, -> for the DTPic type
  45.         r_lbl,g_lbl,b_lbl,
  46.         red_str,green_str,blue_str,outr_cyc,outg_cyc,outb_cyc, -> for the Function type
  47.         red_fail,green_fail,blue_fail,
  48.     width_str,height_str,
  49.             /*action buttons*/
  50.     draw_btn,savepic_btn,savefunc_btn,abort_btn,showme_cyc,close_btn,
  51.     loadfunc_btn,clear_btn,
  52.             /*state area*/
  53.     lamp_lmp,state_txt,state_gau,
  54.  
  55.     ftype_registertitles,size_radiolabels,showme_cyclelabels,
  56.     sigs=0,
  57.     lastid=0,/* lastid is a global variable incremented everytime a project is opened.
  58.                 absolutely no risk to have several projects with same ID*/
  59.     title[15]:STRING,counter=1, -> number of messages
  60.     messages[15]:ARRAY OF LONG,
  61.  
  62.     cat:PTR TO catalog_picFX,
  63.  
  64.     rp=-2,cp=-1,        -> Priorities
  65.     rupd=10,wclose,     -> Render update and Pwindow-close settings
  66.     psema:ss,           -> Semaphore for preferences
  67.  
  68.     currid=-1,quiet=FALSE     -> currid contains the id of the currently selected project. Quiet controls attributes refreshing.
  69.  
  70. DEF nodraw
  71.  
  72. ENUM SETID_MainP=1,
  73.      SETID_RenderP,
  74.      SETID_CurrP,
  75.      SETID_RUpd,
  76.      SETID_Close
  77.  
  78. DEF cl_planefunc:PTR TO mui_customclass
  79. DEF cl_projectlist:PTR TO mui_customclass
  80. DEF cl_uslider:PTR TO mui_customclass
  81. DEF cl_sizetxt:PTR TO mui_customclass
  82. DEF cl_myapp:PTR TO mui_customclass
  83.  
  84. /*Registation Number:FCB96172; I take FCB9 as base... :(*/
  85. ENUM MUIA_PlaneFunc_Bstr=$FCB90000, -> String of the B function
  86.      MUIA_PlaneFunc_Fail,           -> $RGB:How decoding went..
  87.      MUIA_PlaneFunc_Gstr,           -> ..Its string
  88.      MUIA_PlaneFunc_Height,         -> Height of the object
  89.      MUIA_PlaneFunc_ImageFile,      -> FileName of the image to load
  90.      MUIA_PlaneFunc_Left,
  91.      MUIA_PlaneFunc_Loading,        -> TRUE/FALSE
  92.      MUIA_PlaneFunc_LoadM,          -> Way of loading an image, concerning the size
  93.      MUIA_PlaneFunc_Lock,           -> Allows to read/write lock the instance of the class
  94.      MUIA_PlaneFunc_Name,           -> Name of the graph
  95.      MUIA_PlaneFunc_Percent,        -> Percentage of current work done.
  96.      MUIA_PlaneFunc_OutputR,        -> values: OUT_Integer,OUT_Float32 or OUT_Float64,...
  97.      MUIA_PlaneFunc_OutputG,        -> ... or OUT_OldR,OUT_OldG,OUT_OldB,...
  98.      MUIA_PlaneFunc_OutputB,        -> ... or Out_CopyR,OUT_CopyG (!)
  99.      MUIA_PlaneFunc_ProjectID,      -> Used by ProjectList class, it is the ID of the object
  100.      MUIA_PlaneFunc_ProjectNode,    -> Address of the node in the exec_list of opened_lst
  101.      MUIA_PlaneFunc_Quiet,          -> Width/Height changes won't resize the window if non-zero
  102.      MUIA_PlaneFunc_Rstr,           -> Its string
  103.      MUIA_PlaneFunc_State,
  104.      MUIA_PlaneFunc_Top,
  105.      MUIA_PlaneFunc_Type,           -> Type of graph
  106.      MUIA_PlaneFunc_Width           -> Width of the object
  107.  
  108. ENUM MUIM_PlaneFunc_Abort=$FCB90800,-> Aborts Rendering SubTask
  109.      MUIM_PlaneFunc_Clear,          -> Clears bitmap
  110.      MUIM_PlaneFunc_Close,          -> React after a click on the close button.
  111.      MUIM_PlaneFunc_Lamps,          -> This updates the failure lamps of the functions.
  112.      MUIM_PlaneFunc_LoadFunc,       -> Loads a function from disk
  113.      MUIM_PlaneFunc_Render,         -> Launches/pauses the rendering subtask
  114.      MUIM_PlaneFunc_SaveFunc,       -> Saves the function to disk
  115.      MUIM_PlaneFunc_SavePic,        -> Saves the picture to disk, as an ILBM image
  116.      MUIM_PlaneFunc_SetTaskPri,     -> Sets the priority of the subtask
  117.      MUIM_PlaneFunc_Update          -> sent by the subtask, to update the picture display
  118.  
  119. CONST MUIV_PlaneFunc_Type_DTPic=1,
  120.       MUIV_PlaneFunc_Type_Graph=2,
  121.  
  122.       MUIV_PlaneFunc_LoadM_Scale=1,
  123.       MUIV_PlaneFunc_LoadM_CutTile=2,
  124.       MUIV_PlaneFunc_LoadM_ChangeSize=3,
  125.  
  126.       MUIV_PlaneFunc_State_Idle=0,   ->free
  127.       MUIV_PlaneFunc_State_Drawing=1,->busy
  128.       MUIV_PlaneFunc_State_Paused=2, ->busy but paused
  129.       MUIV_PlaneFunc_State_Frozen=3, ->free but being read
  130.       MUIV_PlaneFunc_State_Loading=4,->loading picture
  131.  
  132.       MUIV_PlaneFunc_Lock_Write=-1, -> Want to lock it in write mode, so nobody else may touch the object
  133.       MUIV_PlaneFunc_Lock_NoWrite=0,-> remove writelock
  134.       MUIV_PlaneFunc_Lock_Read=1,   -> Want to lock it in read mode, only reading is now allowed. Nesting counter!
  135.       MUIV_PlaneFunc_Lock_NoRead=0, -> remove one readlock
  136.  
  137.       MUIV_PlaneFunc_Abort_Finish=1,-> Aborted because rendering finished
  138.       MUIV_PlaneFunc_Abort_Abort=2, -> Aborted because user asked
  139.       MUIV_PlaneFunc_Abort_NoLoad=3 -> Aborted because picture could not be loaded
  140.  
  141. ENUM MUIM_ProjectList_DelItem=$FCB91800,-> Closes the current project if possible (i.e. if it isn't read-locked)
  142.      MUIM_ProjectList_Exit,             -> This aborts all currently running projects and quits the application
  143.      MUIM_ProjectList_Forward,          -> Forwards the method (no args!) to the current project
  144.      MUIM_ProjectList_NewItem,          -> Adds an item in the list
  145.      MUIM_ProjectList_Notify,           -> Sends a notification information to the current project
  146.      MUIM_ProjectList_Prefs,            -> writes a new value in a preference variable, protected by psema
  147.      MUIM_ProjectList_Refresh,          -> Refreshes the user interface according to the select item
  148.      MUIM_ProjectList_SetPri,           -> Set the priority of a task (see MUIV_~)
  149.      MUIM_ProjectList_ShowMe            -> Sets the MUIA_Window_Open of the current project
  150.  
  151. ENUM MUIV_ProjectList_Notify_Name=1,    /*gadget that has been changed*/
  152.      MUIV_ProjectList_Notify_Type,
  153.      MUIV_ProjectList_Notify_ImageFile,
  154.      MUIV_ProjectList_Notify_LoadM,
  155.      MUIV_ProjectList_Notify_Red,
  156.      MUIV_ProjectList_Notify_Green,
  157.      MUIV_ProjectList_Notify_Blue,
  158.      MUIV_ProjectList_Notify_OutputR,
  159.      MUIV_ProjectList_Notify_OutputG,
  160.      MUIV_ProjectList_Notify_OutputB,
  161.      MUIV_ProjectList_Notify_Width,
  162.      MUIV_ProjectList_Notify_Height
  163.  
  164. ENUM MUIV_ProjectList_SetPri_Main=0,
  165.      MUIV_ProjectList_SetPri_Render,
  166.      MUIV_ProjectList_SetPri_Curr
  167.  
  168. CONST MUIA_uSlider_Stringify=$FCB92000
  169.  
  170. ENUM MUIM_uSlider_Bigger=$FCB92800,
  171.      MUIM_uSlider_Smaller
  172.  
  173. ENUM STC_STARTUP=-2,
  174.     STC_SHUTDOWN,      /*messages to the subtask*/
  175.     STC_START,
  176.     STC_PAUSE,
  177.     STC_RESTART,
  178.     STC_CHANGEDONE
  179. /***************************************************************
  180. **            Custom PlaneFunc private Class                  **
  181. ****************************************************************
  182. This class is responsible for rendering the functions. It uses a
  183. subtask to avoid the main program to be freezed during rendering
  184. ***************************************************************/
  185.  
  186. OBJECT empty_data -> class that doesn't use any data
  187.     nothing
  188. ENDOBJECT
  189.  
  190. OBJECT projectList_data
  191.     exec_list:PTR TO lh -> list of the opened projects
  192. ENDOBJECT
  193.  
  194. OBJECT uslider_data
  195.     buffer:PTR TO CHAR
  196.     stringify
  197. ENDOBJECT
  198.  
  199. OBJECT args_compare -> MUIM_uSlider_Bigger/Smaller
  200.     id
  201.     than
  202. ENDOBJECT
  203.  
  204. OBJECT args_abort -> Used by MUIM_PlaneFunc_Abort
  205.     id
  206.     reason
  207. ENDOBJECT
  208.  
  209. OBJECT args_ctp -> MUIM_PlaneFunc_SetTaskPri
  210.     id
  211.     value
  212. ENDOBJECT
  213.  
  214. OBJECT args_notify -> Used by MUIM_ProjectList_Notify
  215.     id
  216.     gadget -> MUIV_ProjectList_Notify_<something>
  217.     value
  218. ENDOBJECT
  219.  
  220. OBJECT args_showme -> Used by MUIM_ProjectList_ShowMe
  221.     id
  222.     value
  223. ENDOBJECT
  224.  
  225. OBJECT args_forward -> Used by MUIM_ProjectList_Forward
  226.     id
  227.     method
  228. ENDOBJECT
  229.  
  230. OBJECT args_prefs -> MUIM_ProjectList_Prefs
  231.     id
  232.     var:PTR TO LONG
  233.     value
  234. ENDOBJECT
  235.  
  236. OBJECT args_refresh -> Used by MUIM_ProjectList_Refresh
  237.     id
  238.     ostate -> TRUE if only the 'state' field must be refreshed.
  239. ENDOBJECT
  240.  
  241. OBJECT args_setpri -> MUIM_ProjectList_SetPri
  242.     id
  243.     task -> MUIV_ProjectList_SetPri_*
  244.     value
  245. ENDOBJECT
  246.  
  247. PROC planeFunc_dispatcher(cl:PTR TO iclass,obj,msg:PTR TO msg)
  248. DEF methodid
  249.     methodid:=msg.methodid
  250.     SELECT methodid
  251.     CASE OM_NEW;        RETURN planeFunc_new(cl,obj,msg)
  252.     CASE OM_DISPOSE;    RETURN planeFunc_dispose(cl,obj,msg)
  253.     CASE OM_GET;        RETURN planeFunc_get(cl,obj,msg)   /*gets an attribute*/
  254.     CASE OM_SET;        RETURN planeFunc_set(cl,obj,msg)   /*sets an attribute*/
  255.     CASE MUIM_AskMinMax;RETURN planeFunc_askminmax(cl,obj,msg)
  256.     CASE MUIM_Cleanup;  RETURN planeFunc_cleanup(cl,obj,msg)
  257.     CASE MUIM_Draw;     RETURN planeFunc_draw(cl,obj,msg)  /*mui (or the subtask) asked to redraw*/
  258.     CASE MUIM_HandleInput;RETURN planeFunc_handleinput(cl,obj,msg)
  259.     CASE MUIM_Setup;    RETURN planeFunc_setup(cl,obj,msg)
  260.  
  261.     CASE MUIM_PlaneFunc_Abort;      RETURN planeFunc_abort(cl,obj,msg)      /*public methods...*/
  262.     CASE MUIM_PlaneFunc_Clear;      RETURN planeFunc_clear(cl,obj/*,msg*/)
  263.     CASE MUIM_PlaneFunc_Close;      RETURN planeFunc_close(cl,obj/*,msg*/)
  264.     CASE MUIM_PlaneFunc_Lamps;      RETURN planeFunc_lamps(cl,obj/*,msg*/)
  265.     CASE MUIM_PlaneFunc_LoadFunc;   RETURN planeFunc_loadfunc(cl,obj/*,msg*/)
  266.     CASE MUIM_PlaneFunc_Render;     RETURN planeFunc_render(cl,obj/*,msg*/)
  267.     CASE MUIM_PlaneFunc_SaveFunc;   RETURN planeFunc_savefunc(cl,obj/*,msg*/)
  268.     CASE MUIM_PlaneFunc_SavePic;    RETURN planeFunc_savepic(/*cl,obj,msg*/)
  269.     CASE MUIM_PlaneFunc_SetTaskPri; RETURN planeFunc_settaskpri(cl,obj,msg)
  270.     CASE MUIM_PlaneFunc_Update;     RETURN planeFunc_update(cl,obj/*,msg*/)
  271.     ENDSELECT
  272. ENDPROC doSuperMethodA(cl,obj,msg)
  273.  
  274. PROC planeFunc_new(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO msg)
  275. DEF data:PTR TO planeFunc_data
  276.     IF (obj:=doSuperMethodA(cl,obj,msg))=NIL THEN RETURN 0
  277.     data:=INST_DATA(cl,obj)
  278.  
  279.     data.self:=obj
  280.     data.app:=app
  281.     InitSemaphore(data.sema)
  282.     NEW data.rp
  283.     InitRastPort(data.rp)
  284.  
  285.     data.projectid:=lastid++
  286.     data.failure:=$000
  287.     data.rstr:=String(256)
  288.     data.gstr:=String(256)
  289.     data.bstr:=String(256)
  290.     data.outputr:=OUT_Integer
  291.     data.outputg:=OUT_Integer
  292.     data.outputb:=OUT_Integer
  293.     NEW data.rfunc.create(data.outputr)
  294.     NEW data.gfunc.create(data.outputg)
  295.     NEW data.bfunc.create(data.outputb)
  296.     data.imagefile:=String(256)
  297.  
  298.     StrCopy(data.bstr,'x')
  299.     data.bfunc.decode(data.bstr)
  300.     StrCopy(data.gstr,'y')
  301.     data.gfunc.decode(data.gstr)
  302.     data.height:=255
  303.     StrCopy(data.imagefile,cat.msg_Unnamed.getstr())
  304.     data.loadm:=MUIV_PlaneFunc_LoadM_CutTile
  305.     data.lock:=0
  306.     data.name:=String(32)
  307.     StrCopy(data.name,cat.msg_Unnamed.getstr())
  308.     StrCopy(data.rstr,'(x+y)/2')
  309.     data.rfunc.decode(data.rstr)
  310.     data.paused:=FALSE
  311.     data.type:=MUIV_PlaneFunc_Type_Graph
  312.     data.width:=255
  313.  
  314.     IF cybergfxbase
  315.         data.rp.bitmap:= AllocBitMap(data.width,data.height,24,BMF_MINPLANES OR BMF_CLEAR,NIL)
  316.     ELSE
  317.         data.rp.bitmap:= Pi96AllocBitMap(data.width,data.height,24,BMF_MINPLANES OR BMF_CLEAR,NIL,RGBFB_A8R8G8B8)
  318.     ENDIF
  319.     IF (data.rp.bitmap)
  320.         RETURN obj -> If everything got ok
  321.     ENDIF
  322.     coerceMethodA(cl,obj,OM_DISPOSE) -> In case of failure
  323. ENDPROC
  324. PROC planeFunc_askminmax(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO muip_askminmax)
  325. DEF minmax:PTR TO mui_minmax,data:PTR TO planeFunc_data
  326.     data:=INST_DATA(cl,obj)
  327.     doSuperMethodA(cl,obj,msg)
  328.     minmax:=msg.minmaxinfo
  329.     minmax.maxwidth:=minmax.maxwidth+data.width
  330.     minmax.maxheight:=minmax.maxheight+data.height
  331.     minmax.defwidth:=minmax.defwidth+(data.width)
  332.     minmax.defheight:=minmax.defheight+(data.height)
  333. ENDPROC 0
  334.  
  335. PROC planeFunc_setup(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO msg)
  336.     IF doSuperMethodA(cl,obj,msg)=NIL THEN RETURN FALSE
  337.     Mui_RequestIDCMP(obj,IDCMP_MOUSEBUTTONS)
  338.     ->Mui_RequestIDCMP(obj,IDCMP_RAWKEY)
  339. ENDPROC MUI_TRUE
  340.  
  341. PROC planeFunc_cleanup(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO msg)
  342.     Mui_RejectIDCMP(obj,IDCMP_MOUSEBUTTONS)
  343.     ->Mui_RejectIDCMP(obj,IDCMP_RAWKEY)
  344. ENDPROC doSuperMethodA(cl,obj,msg)
  345.  
  346. PROC planeFunc_handleinput(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO muip_handleinput)
  347. #define _between(a,x,b) (((x)>=(a)) AND ((x)<=(b)))
  348. DEF data:PTR TO planeFunc_data,col,colourstr[30]:STRING,x,y
  349.  
  350.     data:=INST_DATA(cl,obj)
  351.     IF msg.imsg
  352.         IF (msg.imsg.class=IDCMP_MOUSEBUTTONS) AND (msg.imsg.code=SELECTDOWN)
  353.             IF (_between(_mleft(obj),msg.imsg.mousex,_mright(obj)) AND _between(_mtop(obj),msg.imsg.mousey,_bottom(obj)))
  354.                 x:=msg.imsg.mousex-_mleft(obj)+data.left
  355.                 y:=msg.imsg.mousey-_mtop(obj)+data.top
  356.                 /*get colour*/
  357.                 ObtainSemaphore(data.sema)
  358.                 IF cybergfxbase
  359.                     col:=ReadRGBPixel(data.rp,kmod(x,data.width),kmod(y,data.height))
  360.                 ELSE
  361.                     col:=Pi96ReadPixel(data.rp,kmod(x,data.width),kmod(y,data.height))
  362.                 ENDIF
  363.                 ReleaseSemaphore(data.sema)
  364.                 StringF(colourstr,'c(\d,\d,\d)=[\d,\d,\d]',data.projectid,x,y,Shr(col,16),Shr(col AND $FF00,8),col AND $FF)
  365.                 set(colour_txt,MUIA_Text_Contents,colourstr)
  366.             ENDIF
  367. /*        ELSEIF (msg.imsg.class=IDCMP_RAWKEY)
  368.             IF (msg.imsg.code=96) OR (msg.imsg.code=97)
  369.                 data.shift:=TRUE
  370.             ELSEIF (msg.imsg.code=224) OR (msg.imsg.code=225)
  371.                 data.shift:=FALSE
  372.             ENDIF*/
  373.         ENDIF
  374.     ENDIF
  375. ENDPROC doSuperMethodA(cl,obj,msg)
  376.  
  377. PROC planeFunc_clear(cl:PTR TO iclass,obj:PTR TO object/*,msg:PTR TO msg*/)
  378. DEF data:PTR TO planeFunc_data
  379.     data:=INST_DATA(cl,obj)
  380.     ObtainSemaphore(data.sema)
  381.     IF data.lock=0
  382.         SetRast(data.rp,1)
  383.         ReleaseSemaphore(data.sema)
  384.         Mui_Redraw(obj,MADF_DRAWOBJECT)
  385.     ELSE
  386.         ReleaseSemaphore(data.sema)
  387.         message(data.projectid,cat.msgm_WriteVsLock.getstr())
  388.     ENDIF
  389. ENDPROC
  390.  
  391. PROC planeFunc_close(cl:PTR TO iclass,obj:PTR TO object/*,msg:PTR TO msg*/)
  392. DEF data:PTR TO planeFunc_data,kdata:PTR TO projectList_data
  393. DEF state,node:PTR TO project_Node,count=0,exec_list:PTR TO lh
  394.     data:=INST_DATA(cl,obj)
  395.     IF wclose=0
  396.         IF data.projectid=currid
  397.             nnset(showme_cyc,MUIA_Cycle_Active,0) -> update cycle display.
  398.         ENDIF
  399.         set(data.projectnode.window,MUIA_Window_Open,FALSE)
  400.     ELSEIF wclose=1
  401. quiet:=TRUE
  402. IF currid=data.projectid THEN currid:=-1
  403.         kdata:=INST_DATA(cl_projectlist.mcc_class,opened_lst)
  404.         doMethodA(obj,[MUIM_PlaneFunc_Abort,MUIV_PlaneFunc_Abort_Abort])
  405.         get(obj,MUIA_PlaneFunc_State,{state})
  406.         IF state = MUIV_PlaneFunc_State_Frozen
  407.             message(data.projectid,cat.msgm_RemVsFreeze.getstr())
  408.             quiet:=FALSE
  409.             RETURN
  410.         ENDIF
  411.  
  412.         exec_list:=kdata.exec_list
  413.         node:=exec_list.head
  414.         WHILE node.pid <> data.projectid
  415.             count++
  416.             node:=node.ln.succ
  417.         ENDWHILE
  418.         get(obj,MUIA_PlaneFunc_ProjectNode,{state})
  419.         doMethodA(opened_lst,[MUIM_List_Remove,count])
  420.         DisposeLink(node.item)
  421.         set(node.window,MUIA_Window_Open,FALSE)
  422.         doMethodA(app,[OM_REMMEMBER,node.window])
  423.         Mui_DisposeObject(node.window)
  424.         Remove(node)
  425.         END node
  426. quiet:=FALSE
  427.         doMethodA(opened_lst,[MUIM_ProjectList_Refresh,0])
  428.     ENDIF
  429. ENDPROC
  430.  
  431. PROC planeFunc_dispose(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO msg)
  432. DEF data:PTR TO planeFunc_data
  433.     data:=INST_DATA(cl,obj)
  434.     ObtainSemaphore(data.sema)
  435.     data.app:=NIL
  436.     ReleaseSemaphore(data.sema)
  437.     IF data.subtask
  438.         killsubtask(data.subtask)
  439.         IF data.type = MUIV_PlaneFunc_Type_Graph
  440.             free(data.rfunc)
  441.             free(data.gfunc)
  442.             free(data.bfunc)
  443.         ENDIF
  444.     ENDIF
  445.     IF cybergfxbase
  446.         IF (data.rp.bitmap) THEN FreeBitMap(data.rp.bitmap)
  447.     ELSE
  448.         IF (data.rp.bitmap) THEN Pi96FreeBitMap(data.rp.bitmap)
  449.     ENDIF
  450.     END data.rp
  451.     DisposeLink(data.name)
  452.     DisposeLink(data.rstr)
  453.     DisposeLink(data.gstr)
  454.     DisposeLink(data.bstr)
  455.     END data.rfunc
  456.     END data.gfunc
  457.     END data.bfunc
  458.     DisposeLink(data.imagefile)
  459. ENDPROC doSuperMethodA(cl,obj,msg)
  460. PROC planeFunc_lamps(cl:PTR TO iclass,obj:PTR TO object/*,msg:PTR TO msg*/)
  461. DEF data:PTR TO planeFunc_data
  462.     data:=INST_DATA(cl,obj)
  463.     IF data.failure AND $1
  464.         set(blue_fail,MUIA_Lamp_Color,MUIV_Lamp_Color_Error)
  465.     ELSE
  466.         set(blue_fail,MUIA_Lamp_Color,MUIV_Lamp_Color_Ok)
  467.     ENDIF
  468.     data:=INST_DATA(cl,obj)
  469.     IF data.failure AND $10
  470.         set(green_fail,MUIA_Lamp_Color,MUIV_Lamp_Color_Error)
  471.     ELSE
  472.         set(green_fail,MUIA_Lamp_Color,MUIV_Lamp_Color_Ok)
  473.     ENDIF
  474.     IF data.failure AND $100
  475.         set(red_fail,MUIA_Lamp_Color,MUIV_Lamp_Color_Error)
  476.     ELSE
  477.         set(red_fail,MUIA_Lamp_Color,MUIV_Lamp_Color_Ok)
  478.     ENDIF
  479. ENDPROC
  480.  
  481. PROC planeFunc_draw(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO muip_draw)
  482. DEF data:PTR TO planeFunc_data,utop,delta
  483. /*
  484. MovePixelArray(srcx,srcy,rp,dstx,dsty,wid,hei) -> (wid×hei) is the size of the rectangle to be moved!
  485. ScrollRaster(rp,dltx,dlty,xmin,ymin,xmax,ymax) -> (rectangle) is the rectangle where scroll will occur!
  486. */
  487.     doSuperMethodA(cl,obj,msg)
  488.     IF nodraw THEN RETURN
  489.     data:=INST_DATA(cl,obj)
  490.     IF (msg.flags AND MADF_DRAWUPDATE)
  491.         IF data.newtop <> 0/*scroll vertically*/
  492.             ObtainSemaphore(data.sema)
  493.             IF data.newtop < data.top  /*1)scroll upwards*/
  494.                 delta:=data.top-data.newtop
  495.                 IF delta < _mheight(obj)
  496.                     IF pi96base
  497.                         ScrollRaster(_rp(obj),0,-delta,_mleft(obj),_mtop(obj),_mleft(obj)+_mwidth(obj),_mtop(obj)+_mheight(obj))
  498.                     ELSE
  499.                         MovePixelArray(_mleft(obj),_mtop(obj),_rp(obj),_mleft(obj),_mtop(obj)+delta,_mwidth(obj),_mheight(obj)-delta)
  500.                     ENDIF
  501.                 ELSE
  502.                     delta:=_mheight(obj)
  503.                 ENDIF
  504.                 BltBitMapRastPort(data.rp.bitmap,data.left,data.newtop,_rp(obj),_mleft(obj),_mtop(obj),_mwidth(obj),delta,$c0)
  505.             ELSE        /*2)data.newtop > data.top => scroll downwards*/
  506.                 delta:=data.newtop-data.top
  507.                 IF delta < _mheight(obj)
  508.                     IF pi96base
  509.                         ScrollRaster(_rp(obj),0,delta,_mleft(obj),_mtop(obj),_mleft(obj)+_mwidth(obj),_mtop(obj)+_mheight(obj))
  510.                     ELSE
  511.                         MovePixelArray(_mleft(obj),_mtop(obj)+delta,_rp(obj),_mleft(obj),_mtop(obj),_mwidth(obj),_mheight(obj)-delta)
  512.                     ENDIF
  513.                 ELSE
  514.                     delta:=_mheight(obj)
  515.                 ENDIF
  516.                 BltBitMapRastPort(data.rp.bitmap,data.left,data.top+_mheight(obj),_rp(obj),_mleft(obj),_mbottom(obj)-delta+1,_mwidth(obj),delta,$c0)
  517.             ENDIF
  518.             ReleaseSemaphore(data.sema)
  519.             data.top:=data.newtop
  520.             data.newtop:=0
  521.         ENDIF
  522.         IF data.newleft <> 0/*scroll horizontally*/
  523.             ObtainSemaphore(data.sema)
  524.             IF data.newleft < data.left  /*3)scroll leftwards*/
  525.                 delta:=data.left-data.newleft
  526.                 IF delta < _mwidth(obj)
  527.                     IF pi96base
  528.                         ScrollRaster(_rp(obj),-delta,0,_mleft(obj),_mtop(obj),_mleft(obj)+_mwidth(obj),_mtop(obj)+_mheight(obj))
  529.                     ELSE
  530.                         MovePixelArray(_mleft(obj),_mtop(obj),_rp(obj),_mleft(obj)+delta,_mtop(obj),_mwidth(obj)-delta,_mheight(obj))
  531.                     ENDIF
  532.                 ELSE
  533.                     delta:=_mwidth(obj)
  534.                 ENDIF
  535.                 BltBitMapRastPort(data.rp.bitmap,data.newleft,data.top,_rp(obj),_mleft(obj),_mtop(obj),delta,_mheight(obj),$c0)
  536.             ELSE        /*4)data.newleft > data.left => scroll rightwards*/
  537.                 delta:=data.newleft-data.left
  538.                 IF delta < _mwidth(obj)
  539.                     IF pi96base
  540.                         ScrollRaster(_rp(obj),delta,0,_mleft(obj),_mtop(obj),_mleft(obj)+_mwidth(obj),_mtop(obj)+_mheight(obj))
  541.                     ELSE
  542.                         MovePixelArray(_mleft(obj)+delta,_mtop(obj),_rp(obj),_mleft(obj),_mtop(obj),_mwidth(obj)-delta,_mheight(obj))
  543.                     ENDIF
  544.                 ELSE
  545.                     delta :=_mwidth(obj)
  546.                 ENDIF
  547.                 BltBitMapRastPort(data.rp.bitmap,data.left+_mwidth(obj),data.top,_rp(obj),_mright(obj)-delta+1,_mtop(obj),delta,_mheight(obj),$c0)
  548.             ENDIF
  549.             ReleaseSemaphore(data.sema)
  550.             data.left:=data.newleft
  551.             data.newleft:=0
  552.         ENDIF
  553.         utop:=data.drawn+1  /*5) Update display*/
  554.         delta:=data.calculated-data.drawn            /*I don't think that the semaphore is required here, only the lines that are already been*/
  555.         IF delta > 0                                /*calculated will be drawn and data.calculated is accessed only once.*/
  556.             IF (utop < (data.top+_mheight(obj))) AND (utop+delta > data.top)
  557.                 IF utop < data.top
  558.                     delta:=delta-data.top+utop
  559.                     utop:=data.top
  560.                 ELSEIF (utop+delta) > (data.top+_mheight(obj))
  561.                     delta:=data.top+_mheight(obj)-utop
  562.                 ENDIF
  563.                 BltBitMapRastPort(data.rp.bitmap,data.left,utop,_rp(obj),_mleft(obj),_mtop(obj)+utop-data.top,_mwidth(obj),delta,$c0)
  564.             ENDIF
  565.         ENDIF
  566.         data.drawn:=data.calculated
  567.     ELSEIF (msg.flags AND MADF_DRAWOBJECT)
  568.         /*the window may have been resized..*/
  569.         ObtainSemaphore(data.sema)
  570.         set(data.hscroll,MUIA_Prop_Visible,_mwidth(obj))
  571.         set(data.vscroll,MUIA_Prop_Visible,_mheight(obj))
  572.         get(data.vscroll,MUIA_Prop_First,{delta})
  573.         data.top:=delta
  574.         get(data.hscroll,MUIA_Prop_First,{delta})
  575.         data.left:=delta
  576.         BltBitMapRastPort(data.rp.bitmap,data.left,data.top,_rp(obj),_mleft(obj),_mtop(obj),_mwidth(obj),_mheight(obj),$c0)
  577.         data.drawn:=data.calculated
  578.         ReleaseSemaphore(data.sema)
  579.     ENDIF
  580. ENDPROC
  581.  
  582. PROC planeFunc_get(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO opget)
  583. DEF data:PTR TO planeFunc_data,storage,attrid
  584.  
  585.     data:=INST_DATA(cl,obj)
  586.     attrid:=msg.attrid
  587.     storage:=msg.storage
  588.     ObtainSemaphore(data.sema)
  589.     SELECT attrid
  590.     CASE MUIA_PlaneFunc_Bstr
  591.         ^storage:=data.bstr
  592.     CASE MUIA_PlaneFunc_Gstr
  593.         ^storage:=data.gstr
  594.     CASE MUIA_PlaneFunc_Height
  595.         ^storage:=data.height
  596.     CASE MUIA_PlaneFunc_ImageFile
  597.         ^storage:=data.imagefile
  598.     CASE MUIA_PlaneFunc_Loading
  599.         ^storage:=data.loading
  600.     CASE MUIA_PlaneFunc_LoadM
  601.         ^storage:=data.loadm
  602.     CASE MUIA_PlaneFunc_Lock
  603.         ^storage:=data.lock
  604.     CASE MUIA_PlaneFunc_Name
  605.         ^storage:=data.name
  606.     CASE MUIA_PlaneFunc_Percent
  607.         IF data.lock=MUIV_PlaneFunc_Lock_Write
  608.             ^storage:=data.calculated*100/data.height
  609.         ELSE
  610.             ^storage:=0
  611.         ENDIF
  612.     CASE MUIA_PlaneFunc_OutputR
  613.         ^storage:=data.outputr
  614.     CASE MUIA_PlaneFunc_OutputG
  615.         ^storage:=data.outputg
  616.     CASE MUIA_PlaneFunc_OutputB
  617.         ^storage:=data.outputb
  618.     CASE MUIA_PlaneFunc_ProjectID
  619.         ^storage:=data.projectid
  620.     CASE MUIA_PlaneFunc_ProjectNode
  621.         ^storage:=data.projectnode
  622.     CASE MUIA_PlaneFunc_Quiet
  623.         ^storage:=data.quiet
  624.     CASE MUIA_PlaneFunc_Rstr
  625.         ^storage:=data.rstr
  626.     CASE MUIA_PlaneFunc_State
  627.         IF data.lock = MUIV_PlaneFunc_Lock_Write
  628.             IF data.paused
  629.                 ^storage:=MUIV_PlaneFunc_State_Paused
  630.             ELSEIF data.loading
  631.                 ^storage:=MUIV_PlaneFunc_State_Loading
  632.             ELSE
  633.                 ^storage:=MUIV_PlaneFunc_State_Drawing
  634.             ENDIF
  635.         ELSE
  636.             IF data.lock = 0
  637.                 ^storage:=MUIV_PlaneFunc_State_Idle
  638.             ELSE
  639.                 ^storage:=MUIV_PlaneFunc_State_Frozen
  640.             ENDIF
  641.         ENDIF
  642.     CASE MUIA_PlaneFunc_Type
  643.         ^storage:=data.type
  644.     CASE MUIA_PlaneFunc_Width
  645.         ^storage:=data.width
  646.     DEFAULT
  647.         ReleaseSemaphore(data.sema)
  648.         RETURN doSuperMethodA(cl,obj,msg)
  649.     ENDSELECT
  650.     ReleaseSemaphore(data.sema)
  651. ENDPROC MUI_TRUE
  652.  
  653. PROC planeFunc_set(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO opset)
  654. DEF data:PTR TO planeFunc_data,
  655.     tags:PTR TO tagitem,
  656.     tag:PTR TO tagitem,
  657.     attrid
  658. DEF window,group
  659.  
  660.     data:=INST_DATA(cl,obj)
  661.     tags:=msg.attrlist
  662.     ObtainSemaphore(data.sema)
  663.     WHILE tag:=NextTagItem({tags})
  664.         attrid:=tag.tag
  665.         SELECT attrid
  666.         CASE MUIA_PlaneFunc_ImageFile
  667.             StrCopy(data.imagefile,tag.data)
  668.         CASE MUIA_PlaneFunc_Loading
  669.             data.loading:=tag.data
  670.             IF data.projectid=currid THEN
  671.                 setlamp(obj)
  672.         CASE MUIA_PlaneFunc_Left
  673.             data.newleft:=tag.data
  674.             Mui_Redraw(obj,MADF_DRAWUPDATE)
  675.         CASE MUIA_PlaneFunc_ProjectNode
  676.             data.projectnode:=tag.data
  677.         CASE MUIA_PlaneFunc_Top
  678.             data.newtop:=tag.data
  679.             Mui_Redraw(obj,MADF_DRAWUPDATE)
  680.         CASE MUIA_PlaneFunc_Lock
  681.             IF data.lock=MUIV_PlaneFunc_Lock_Write-> If the object is being written, the only tag allowed is NoWrite
  682.                 IF tag.data=MUIV_PlaneFunc_Lock_NoWrite
  683.                     data.lock:=0
  684.                 ENDIF
  685.             ELSEIF data.lock=0            -> If the object is free, it can either be read or write - locked
  686.                 data.lock:=tag.data
  687.             ELSE                         -> If the object is read locked, it can be read unlocked or read locked again.
  688.                 IF tag.data=MUIV_PlaneFunc_Lock_NoRead
  689.                     data.lock:=data.lock-1
  690.                 ELSEIF tag.data=MUIV_PlaneFunc_Lock_Read
  691.                     data.lock:=data.lock+1
  692.                 ENDIF
  693.             ENDIF
  694.             doMethodA(opened_lst,[MUIM_ProjectList_Refresh,data.projectid+2]) -> Refresh the "state" lamp.
  695.         CASE MUIA_PlaneFunc_Name
  696.             StrCopy(data.name,tag.data)
  697.             get(obj,MUIA_WindowObject,{window})
  698.             set(window,MUIA_Window_Title,data.name)
  699.         CASE MUIA_PlaneFunc_Quiet
  700.             data.quiet:=tag.data
  701.             IF data.quiet=FALSE
  702.                 get(obj,MUIA_Parent,{group})
  703.                 doMethodA(group,[MUIM_Group_InitChange])
  704.                 doMethodA(group,[MUIM_Group_ExitChange])
  705.                 IF cybergfxbase
  706.                     IF (data.rp.bitmap) THEN FreeBitMap(data.rp.bitmap)
  707.                     data.rp.bitmap:= AllocBitMap(data.width,data.height,24,BMF_MINPLANES OR BMF_CLEAR,NIL)
  708.                 ELSE
  709.                     IF (data.rp.bitmap) THEN Pi96FreeBitMap(data.rp.bitmap)
  710.                     data.rp.bitmap:= Pi96AllocBitMap(data.width,data.height,24,BMF_MINPLANES OR BMF_CLEAR,NIL,RGBFB_A8R8G8B8)
  711.                 ENDIF
  712.                 IF data.projectid=currid
  713.                     nnset(width_str,MUIA_String_Integer,data.width)
  714.                     nnset(height_str,MUIA_String_Integer,data.height)
  715.                 ENDIF
  716.                 IF data.subtask THEN
  717.                     sendsubtaskmsg(data.subtask,STC_CHANGEDONE,NIL)
  718.             ENDIF
  719.         DEFAULT
  720.             IF (data.lock <> MUIV_PlaneFunc_Lock_Write) OR (data.quiet=-2)
  721.                 SELECT attrid
  722.                 CASE MUIA_PlaneFunc_Bstr
  723.                     StrCopy(data.bstr,tag.data)
  724.                     LowerStr(data.bstr)
  725.                     IF data.bfunc.decode(tag.data)
  726.                         data.failure:=data.failure OR $001
  727.                     ELSE
  728.                         data.failure:=data.failure AND $FFE
  729.                     ENDIF
  730.                     doMethodA(obj,[MUIM_PlaneFunc_Lamps])
  731.                 CASE MUIA_PlaneFunc_Gstr
  732.                     StrCopy(data.gstr,tag.data)
  733.                     LowerStr(data.gstr)
  734.                     IF data.gfunc.decode(tag.data)
  735.                         data.failure:=data.failure OR $010
  736.                     ELSE
  737.                         data.failure:=data.failure AND $FEF
  738.                     ENDIF
  739.                     doMethodA(obj,[MUIM_PlaneFunc_Lamps])
  740.                 CASE MUIA_PlaneFunc_LoadM
  741.                     data.loadm:=tag.data
  742.                 CASE MUIA_PlaneFunc_OutputR
  743.                     data.outputr:=tag.data
  744.                     IF tag.data <= OUT_Float64
  745.                         /*when precision is changed, the function must be freed,*/
  746.                         END data.rfunc
  747.                         /*reallocated with the new precision,*/
  748.                         NEW data.rfunc.create(data.outputr)
  749.                         /*decoded again to with the new precision.*/
  750.                         data.rfunc.decode(data.rstr)
  751.                     ENDIF
  752.                 CASE MUIA_PlaneFunc_OutputG
  753.                     data.outputg:=tag.data
  754.                     IF tag.data <= OUT_Float64
  755.                         END data.gfunc
  756.                         NEW data.gfunc.create(data.outputg)
  757.                         data.gfunc.decode(data.gstr)
  758.                     ENDIF
  759.                 CASE MUIA_PlaneFunc_OutputB
  760.                     data.outputb:=tag.data
  761.                     IF tag.data <= OUT_Float64
  762.                         END data.bfunc
  763.                         NEW data.bfunc.create(data.outputb)
  764.                         data.bfunc.decode(data.bstr)
  765.                     ENDIF
  766.                 CASE MUIA_PlaneFunc_Rstr
  767.                     StrCopy(data.rstr,tag.data)
  768.                     LowerStr(data.rstr)
  769.                     IF data.rfunc.decode(tag.data)
  770.                         data.failure:=data.failure OR $100
  771.                     ELSE
  772.                         data.failure:=data.failure AND $EFF
  773.                     ENDIF
  774.                     doMethodA(obj,[MUIM_PlaneFunc_Lamps])
  775.                 CASE MUIA_PlaneFunc_Type
  776.                     data.type:=tag.data
  777.                 DEFAULT
  778.                     IF (data.lock <> MUIV_PlaneFunc_Lock_NoRead) AND (data.quiet<>-2)
  779.                         message(data.projectid,cat.msgm_AttrVsLock.getstr())
  780.                     ELSEIF attrid = MUIA_PlaneFunc_Width
  781.                         data.width:=tag.data
  782.                         set(data.hscroll,MUIA_Prop_Entries,tag.data)
  783.                         IF data.quiet=FALSE
  784.                             get(obj,MUIA_Parent,{group})
  785.                             doMethodA(group,[MUIM_Group_InitChange])
  786.                             doMethodA(group,[MUIM_Group_ExitChange])
  787.                             IF cybergfxbase
  788.                                 IF (data.rp.bitmap) THEN FreeBitMap(data.rp.bitmap)
  789.                                 data.rp.bitmap:= AllocBitMap(data.width,data.height,24,BMF_MINPLANES OR BMF_CLEAR,NIL)
  790.                             ELSE
  791.                                 IF (data.rp.bitmap) THEN Pi96FreeBitMap(data.rp.bitmap)
  792.                                 data.rp.bitmap:= Pi96AllocBitMap(data.width,data.height,24,BMF_MINPLANES OR BMF_CLEAR,NIL,RGBFB_A8R8G8B8)
  793.                             ENDIF
  794.                         ENDIF
  795.                     ELSEIF attrid = MUIA_PlaneFunc_Height
  796.                         data.height:=tag.data
  797.                         set(data.vscroll,MUIA_Prop_Entries,tag.data)
  798.                         IF data.quiet=FALSE
  799.                             get(obj,MUIA_Parent,{group})
  800.                             doMethodA(group,[MUIM_Group_InitChange])
  801.                             doMethodA(group,[MUIM_Group_ExitChange])
  802.                             IF cybergfxbase
  803.                             IF (data.rp.bitmap) THEN FreeBitMap(data.rp.bitmap)
  804.                                 data.rp.bitmap:= AllocBitMap(data.width,data.height,24,BMF_MINPLANES OR BMF_CLEAR,NIL)
  805.                             ELSE
  806.                                 IF (data.rp.bitmap) THEN Pi96FreeBitMap(data.rp.bitmap)
  807.                                 data.rp.bitmap:= Pi96AllocBitMap(data.width,data.height,24,BMF_MINPLANES OR BMF_CLEAR,NIL,RGBFB_A8R8G8B8)
  808.                             ENDIF
  809.                         ENDIF
  810.                     ENDIF
  811.                 ENDSELECT
  812.             ELSE
  813.                 message(data.projectid,cat.msgm_AttrVsLock.getstr())
  814.             ENDIF
  815.         ENDSELECT
  816.     ENDWHILE
  817.     ReleaseSemaphore(data.sema)
  818. ENDPROC doSuperMethodA(cl,obj,msg)
  819.  
  820. PROC planeFunc_abort(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO args_abort)
  821. DEF data:PTR TO planeFunc_data,ds1:PTR TO datestamp,ds2:datestamp,qe[30]:STRING,u
  822.     data:=INST_DATA(cl,obj)
  823.     IF data.subtask
  824.         killsubtask(data.subtask)
  825.         data.subtask:=NIL
  826.         set(obj,MUIA_PlaneFunc_Lock,MUIV_PlaneFunc_Lock_NoWrite)
  827.         IF data.type = MUIV_PlaneFunc_Type_Graph
  828.             free(data.rfunc)
  829.             free(data.gfunc)
  830.             free(data.bfunc)
  831.         ENDIF
  832.         u:=msg.reason
  833.         SELECT u
  834.         CASE MUIV_PlaneFunc_Abort_Finish
  835.             ds1:=data.ds
  836.             DateStamp(ds2)
  837.             u:=(ds2.minute-ds1.minute)*TICKS_PER_MINUTE+ds2.tick-ds1.tick -> number of ticks
  838.             StringF(qe,'\s  \z\d[2]:\z\d[2].\z\d[2].',cat.msgm_Done.getstr(),u/TICKS_PER_MINUTE,Mod(u,TICKS_PER_MINUTE)/TICKS_PER_SECOND,Mod(u,TICKS_PER_SECOND)*100/TICKS_PER_SECOND)
  839.             message(data.projectid,qe)
  840.         CASE MUIV_PlaneFunc_Abort_Abort
  841.             message(data.projectid,cat.msgm_Abort.getstr())
  842.         CASE MUIV_PlaneFunc_Abort_NoLoad
  843.             message(data.projectid,cat.msgm_NoLoad.getstr())
  844.         ENDSELECT
  845.  
  846.         data.drawn:=0
  847.         data.calculated:=0
  848.         data.paused:=FALSE
  849.     ENDIF
  850. ENDPROC
  851.  
  852. PROC planeFunc_loadfunc(cl:PTR TO iclass,obj:PTR TO object/*,msg:PTR TO msg*/)
  853. DEF u,filereq:PTR TO filerequester,s[200]:STRING,handler,data:PTR TO planeFunc_data,
  854.     eq,var[10]:STRING,value:PTR TO CHAR
  855.  
  856.     data:=INST_DATA(cl,obj)
  857.     get(settings_win,MUIA_Window_Window,{u})
  858.     filereq:=AllocAslRequest(ASL_FILEREQUEST,
  859.                             [ASL_HAIL,      cat.msgr_Loadf_T.getstr(),
  860.                              ASL_OKTEXT,    cat.msgr_Loadf_Ok.getstr(),
  861.                              ASL_DIR,       'progdir:Functions/',
  862.                              ASL_WINDOW,    u,
  863.                              NIL])
  864.     IF filereq=NIL
  865.         Mui_RequestA(app,settings_win,0,cat.msgr_Loadf_T.getstr(),NIL,cat.msgr_NoAslReq.getstr(),NIL)
  866.     ELSE
  867.         IF AslRequest(filereq,NIL)
  868.             StrCopy(s,filereq.drawer)
  869.             AddPart(s,filereq.file,StrMax(s))
  870.             SetStr(s,StrLen(s))
  871.         ENDIF
  872.         FreeAslRequest(filereq)
  873.     ENDIF
  874.     IF s[] = NIL THEN RETURN
  875.     handler:=Open(s,OLDFILE)
  876.     Fgets(handler,s,StrMax(s)-1)
  877.     IF s[]=NIL
  878.         Close(handler)
  879.         message(data.projectid,cat.msgm_EmptyFile.getstr())
  880.         RETURN
  881.     ENDIF
  882.     SetStr(s,StrLen(s)-1)
  883.     IF Not(StrCmp(s,'picFX function-file; type1'))
  884.         Close(handler)
  885.         message(data.projectid,cat.msgm_BadFile.getstr())
  886.         RETURN
  887.     ENDIF
  888.     set(obj,MUIA_PlaneFunc_Quiet,MUI_TRUE)
  889.     WHILE Fgets(handler,s,StrMax(s)-1)/* semaphore will be obtained in the SET method */
  890.         SetStr(s,StrLen(s)-1)
  891.         eq:=InStr(s,'=')
  892.         StrCopy(var,s,eq)
  893.         value:=s+eq+1
  894.         IF StrCmp(var,'bstr')
  895.             set(obj,MUIA_PlaneFunc_Bstr,value)
  896.         ELSEIF StrCmp(var,'gstr')
  897.             set(obj,MUIA_PlaneFunc_Gstr,value)
  898.         ELSEIF StrCmp(var,'height')
  899.             set(obj,MUIA_PlaneFunc_Height,Val(value))
  900.         ELSEIF StrCmp(var,'rstr')
  901.             set(obj,MUIA_PlaneFunc_Rstr,value)
  902.         ELSEIF StrCmp(var,'width')
  903.             set(obj,MUIA_PlaneFunc_Width,Val(value))
  904.         ELSEIF StrCmp(var,'precision') -> Obsolete tag!
  905.             set(obj,MUIA_PlaneFunc_OutputR,Val(value))
  906.             set(obj,MUIA_PlaneFunc_OutputG,Val(value))
  907.             set(obj,MUIA_PlaneFunc_OutputB,Val(value))
  908.             message(data.projectid,'Warning, obsolete tag "precision" used!')
  909.         ELSEIF StrCmp(var,'outputr')
  910.             set(obj,MUIA_PlaneFunc_OutputR,Val(value))
  911.         ELSEIF StrCmp(var,'outputg')
  912.             set(obj,MUIA_PlaneFunc_OutputG,Val(value))
  913.         ELSEIF StrCmp(var,'outputb')
  914.             set(obj,MUIA_PlaneFunc_OutputB,Val(value))
  915.         ELSE
  916.             StringF(s,cat.msgm_UnknownVar.getstr(),var)
  917.             message(data.projectid,s)
  918.         ENDIF
  919.     ENDWHILE
  920.     Close(handler)
  921.     set(obj,MUIA_PlaneFunc_Quiet,FALSE)
  922.     doMethodA(opened_lst,[MUIM_ProjectList_Refresh,0])
  923. ENDPROC
  924.  
  925. PROC planeFunc_render(cl:PTR TO iclass,obj:PTR TO object/*,msg*/)
  926. DEF data:PTR TO planeFunc_data,state
  927.     data:=INST_DATA(cl,obj)
  928.     get(obj,MUIA_PlaneFunc_State,{state})
  929.     SELECT state
  930.     CASE MUIV_PlaneFunc_State_Idle
  931.         IF data.type = MUIV_PlaneFunc_Type_DTPic
  932.             set(obj,MUIA_PlaneFunc_Loading,TRUE)
  933.             set(obj,MUIA_PlaneFunc_Lock,MUIV_PlaneFunc_Lock_Write)
  934.             /* the following call starts the sub task */
  935.             data.subtask:= spawnsubtask('PicFX-Render-Task',{loadpicture},data)
  936.             IF (data.subtask)
  937.                 SetTaskPri(data.subtask.st_Task,cp)
  938.                 sendsubtaskmsg(data.subtask,STC_START,NIL)
  939.             ENDIF
  940.         ELSE
  941.             set(obj,MUIA_PlaneFunc_Lock,MUIV_PlaneFunc_Lock_Write)
  942.             IF freeze(data.rfunc) = 0 -> This will freeze used projects; if zero, it failed.
  943.                 message(data.projectid,cat.msgm_NoAlloc.getstr())
  944.                 set(obj,MUIA_PlaneFunc_Lock,MUIV_PlaneFunc_Lock_NoWrite)
  945.                 RETURN
  946.             ENDIF
  947.             IF freeze(data.gfunc) = 0
  948.                 message(data.projectid,cat.msgm_NoAlloc.getstr())
  949.                 set(obj,MUIA_PlaneFunc_Lock,MUIV_PlaneFunc_Lock_NoWrite)
  950.                 RETURN
  951.             ENDIF
  952.             IF freeze(data.bfunc) = 0
  953.                 message(data.projectid,cat.msgm_NoAlloc.getstr())
  954.                 set(obj,MUIA_PlaneFunc_Lock,MUIV_PlaneFunc_Lock_NoWrite)
  955.                 RETURN
  956.             ENDIF
  957.             data.savepixel:=(data.outputr>=OUT_OldR) AND (data.outputr<=OUT_OldB)
  958.             data.savepixel:=data.savepixel OR ((data.outputg>=OUT_OldR) AND (data.outputg<=OUT_OldB))
  959.             data.savepixel:=data.savepixel OR ((data.outputb>=OUT_OldR) AND (data.outputb<=OUT_OldB))
  960. ->            messagefmt(data.projectid,'starting drawing; save is \d',data.savepixel)
  961.  
  962.             data.subtask:= spawnsubtask('PicFX-Render-Task',{renderfunc},data)
  963.             IF (data.subtask)
  964.                 SetTaskPri(data.subtask.st_Task,cp)
  965.                 sendsubtaskmsg(data.subtask,STC_START,NIL)
  966.             ENDIF
  967.         ENDIF
  968.     CASE MUIV_PlaneFunc_State_Drawing
  969.         sendsubtaskmsg(data.subtask,STC_PAUSE,NIL)
  970.         data.paused:=TRUE
  971.         doMethodA(opened_lst,[MUIM_ProjectList_Refresh,data.projectid+2])
  972.     CASE MUIV_PlaneFunc_State_Paused
  973.         data.paused:=FALSE
  974.         sendsubtaskmsg(data.subtask,STC_RESTART,NIL)
  975.         doMethodA(opened_lst,[MUIM_ProjectList_Refresh,data.projectid+2])
  976.     CASE MUIV_PlaneFunc_State_Frozen
  977.         message(data.projectid,cat.msgm_WriteVsFreeze.getstr())
  978.     ENDSELECT
  979. ENDPROC
  980.  
  981. PROC planeFunc_savefunc(cl:PTR TO iclass,obj:PTR TO object/*,msg:PTR TO msg*/)
  982. DEF u,filereq:PTR TO filerequester,s[200]:STRING,newhandler,oldhandler,data:PTR TO planeFunc_data
  983.     data:=INST_DATA(cl,obj)
  984.     get(settings_win,MUIA_Window_Window,{u})
  985.     filereq:=AllocAslRequest(ASL_FILEREQUEST,
  986.                             [ASL_HAIL,      cat.msgr_Savef_T.getstr(),
  987.                              ASL_OKTEXT,    cat.msgr_Savef_Ok.getstr(),
  988.                              ASL_DIR,       'progdir:Functions/',
  989.                              ASL_WINDOW,    u,
  990.                              ASL_FUNCFLAGS, FILF_SAVE,
  991.                              NIL])
  992.     IF filereq=NIL
  993.         Mui_RequestA(app,settings_win,0,cat.msgr_Savef_T.getstr(),NIL,cat.msgr_NoAslReq.getstr(),NIL)
  994.     ELSE
  995.         IF AslRequest(filereq,NIL)
  996.             StrCopy(s,filereq.drawer)
  997.             AddPart(s,filereq.file,StrMax(s))
  998.             SetStr(s,StrLen(s))
  999.         ENDIF
  1000.         FreeAslRequest(filereq)
  1001.     ENDIF
  1002.     IF s[] = NIL THEN RETURN
  1003.     newhandler:=Open(s,NEWFILE)
  1004.     oldhandler:=SetStdOut(newhandler)
  1005.     WriteF('picFX function-file; type1\n')
  1006.     ObtainSemaphore(data.sema)
  1007.     WriteF('bstr=\s\n',data.bstr)
  1008.     WriteF('gstr=\s\n',data.gstr)
  1009.     WriteF('height=\d\n',data.height)
  1010.     WriteF('rstr=\s\n',data.rstr)
  1011.     WriteF('outputr=\d\n',data.outputr)
  1012.     WriteF('outputg=\d\n',data.outputg)
  1013.     WriteF('outputb=\d\n',data.outputb)
  1014.     WriteF('width=\d\n',data.width)
  1015.     ReleaseSemaphore(data.sema)
  1016.     Close(newhandler)
  1017.     SetStdOut(oldhandler)
  1018. ENDPROC
  1019.  
  1020. PROC planeFunc_savepic(/*cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO args_file*/)
  1021. ENDPROC
  1022.  
  1023. PROC planeFunc_settaskpri(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO args_ctp)
  1024. DEF data:PTR TO planeFunc_data
  1025.     data:=INST_DATA(cl,obj)
  1026.     ObtainSemaphore(data.sema)
  1027.     IF data.subtask THEN
  1028.         SetTaskPri(data.subtask.st_Task,msg.value)
  1029.     ReleaseSemaphore(data.sema)
  1030. ENDPROC
  1031. PROC planeFunc_update(cl:PTR TO iclass,obj:PTR TO object/*,msg:PTR TO msg*/)
  1032. DEF data:PTR TO planeFunc_data
  1033.     data:=INST_DATA(cl,obj)
  1034.     ObtainSemaphore(data.sema)
  1035.     data.app:=NIL
  1036.     ReleaseSemaphore(data.sema)
  1037.     Mui_Redraw(obj,MADF_DRAWUPDATE)
  1038.     IF data.projectid = currid
  1039. ->        ObtainSemaphore(data.sema)
  1040.         set(state_gau,MUIA_Gauge_Current,data.calculated*100/data.height)
  1041. ->        ReleaseSemaphore(data.sema)
  1042.     ENDIF
  1043.     ObtainSemaphore(data.sema)
  1044.     data.app:=app
  1045.     ReleaseSemaphore(data.sema)
  1046. ENDPROC
  1047.  
  1048. /***************************************************************
  1049. ** custom ProjectList private subclass of List class          **
  1050. ****************************************************************
  1051. **                                                            **
  1052. ** Interaction between the application and the opened projects**
  1053. ***************************************************************/
  1054.  
  1055. CONST PROJECTNODE_ID=100
  1056.  
  1057. PROC projectList_dispatcher(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO msg)
  1058. DEF methodid
  1059.     methodid:=msg.methodid
  1060.     SELECT methodid
  1061.     CASE OM_NEW                   ; RETURN projectList_new(cl,obj,msg)
  1062.     CASE OM_DISPOSE               ; RETURN projectList_dispose(cl,obj,msg)
  1063.     CASE MUIM_Setup               ; RETURN projectList_setup(cl,obj,msg)
  1064.     CASE MUIM_ProjectList_DelItem ; RETURN projectList_delitem(cl,obj/*,msg*/)
  1065.     CASE MUIM_ProjectList_Exit    ; RETURN projectList_exit(cl,obj/*,msg*/)
  1066.     CASE MUIM_ProjectList_Forward ; RETURN projectList_forward(cl,obj,msg)
  1067.     CASE MUIM_ProjectList_NewItem ; RETURN projectList_newitem(cl,obj/*,msg*/)
  1068.     CASE MUIM_ProjectList_Notify  ; RETURN projectList_notify(cl,obj,msg)
  1069.     CASE MUIM_ProjectList_Prefs   ; RETURN projectList_prefs(/*cl,obj,*/msg)
  1070.     CASE MUIM_ProjectList_Refresh ; RETURN projectList_refresh(cl,obj,msg)
  1071.     CASE MUIM_ProjectList_SetPri  ; RETURN projectList_setpri(cl,obj,msg)
  1072.     CASE MUIM_ProjectList_ShowMe  ; RETURN projectList_showme(cl,obj,msg)
  1073.     ENDSELECT
  1074. ENDPROC doSuperMethodA(cl,obj,msg)
  1075.  
  1076. PROC getcurrent(data:PTR TO projectList_data,obj:PTR TO object)
  1077. DEF active
  1078. DEF exec_list:PTR TO lh,worknode:PTR TO project_Node,z,list:PTR TO mlh,cs:PTR TO object
  1079.     get(obj,MUIA_List_Active,{active})
  1080.     IF active=MUIV_List_Active_Off THEN RETURN 0
  1081.     exec_list:=data.exec_list
  1082.     worknode:=exec_list.head
  1083.               /* I should add here a check that the bound of the list is never reached!*/
  1084.     IF active > 0
  1085.         FOR z:=1 TO active
  1086.             worknode:=worknode.ln.succ
  1087.         ENDFOR
  1088.     ENDIF
  1089.     get(worknode.window,MUIA_Window_RootObject,{z})
  1090.  
  1091.     get(z,MUIA_Group_ChildList,{list})
  1092.     cs:=list.head
  1093. ENDPROC NextObject({cs}),worknode.window
  1094.  
  1095. /*Care! getp() asks the ProjectID and not line number!!!*/
  1096.  
  1097. PROC getp(data:PTR TO projectList_data,pid)
  1098. DEF exec_list:PTR TO lh,worknode:PTR TO project_Node,z,list:PTR TO mlh,cs:PTR TO object
  1099.  
  1100.     exec_list:=data.exec_list
  1101.     worknode:=exec_list.head
  1102.               /* I should add here a check that the bound of the list is never reached!*/
  1103.     WHILE mcomp(worknode,pid)
  1104.         worknode:=worknode.ln.succ
  1105.     ENDWHILE
  1106.     IF worknode.ln.succ = 0
  1107.         z:=String(80)
  1108.         StringF(z,cat.msgm_NoID.getstr(),pid)
  1109.         message(-1,z)
  1110.         DisposeLink(z)
  1111.         RETURN 0,0
  1112.     ENDIF
  1113.     get(worknode.window,MUIA_Window_RootObject,{z})
  1114.  
  1115.     get(z,MUIA_Group_ChildList,{list})
  1116.     cs:=list.head
  1117. ENDPROC NextObject({cs}),worknode.window
  1118.  
  1119. PROC mcomp(node:PTR TO project_Node,id)
  1120.     IF node.ln.succ=0 THEN RETURN FALSE -> This silly proc to avoid a atupid enforcer hit :-s
  1121. ENDPROC (node.pid <> id)
  1122.  
  1123. PROC getdata(data:PTR TO projectList_data,pid)
  1124. DEF gad
  1125.     gad:=getp(data,pid)
  1126.     IF gad = 0 THEN RETURN 0
  1127. ENDPROC INST_DATA(cl_planefunc.mcc_class,gad)
  1128.  
  1129. PROC projectList_new(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO msg)
  1130. DEF exec_list:PTR TO lh,data:PTR TO projectList_data
  1131.     IF (obj:=doSuperMethodA(cl,obj,msg)) = FALSE THEN RETURN FALSE
  1132.     data:=INST_DATA(cl,obj)
  1133.     NEW exec_list
  1134.     newList(exec_list) -> Create an Exec list for the opened projects
  1135.     data.exec_list:=exec_list -> save the list in the instance data
  1136. ENDPROC obj
  1137.  
  1138. PROC projectList_setup(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO muip_setup)
  1139. DEF id,data:PTR TO projectList_data
  1140.     IF doSuperMethodA(cl,obj,msg) = FALSE THEN RETURN FALSE
  1141.     data:=INST_DATA(cl,obj)
  1142.     IF (msg.renderinfo.mri_flags AND MUIMRI_TRUECOLOR) = 0
  1143.         message(-1,cat.msgm_NoCgx.getstr())
  1144.         message(-1,cat.msgm_NoDraw.getstr())
  1145.         nodraw:=MUI_TRUE
  1146.     ELSEIF nodraw=MUI_TRUE
  1147.         nodraw:=FALSE
  1148.         message(-1,cat.msgm_CgxOk.getstr())
  1149.         message(-1,cat.msgm_DrawOk.getstr())
  1150.     ENDIF
  1151.     id:=GetVPModeID(msg.renderinfo.mri_screen.viewport) AND $FFF00000
  1152.         /*This is only due to my observation, that first three
  1153.          quartets "seem" to be constant for a given monitor*/
  1154.  
  1155.     SELECT id
  1156.     CASE $40d00000 /*cgx*/
  1157.         IF pi96base
  1158.             CloseLibrary(pi96base)
  1159.             pi96base:=0
  1160.         ENDIF
  1161.         IF Not(cybergfxbase) THEN cybergfxbase:=OpenLibrary('cybergraphics.library',0)
  1162.         IF cybergfxbase=0
  1163.             messagefmt(-1,cat.msg_Nolib.getstr(), 'cybergraphics.library')
  1164.         ENDIF
  1165.     CASE $50000000 /*p96*/
  1166.         IF cybergfxbase
  1167.             CloseLibrary(cybergfxbase)
  1168.             cybergfxbase:=0
  1169.         ENDIF
  1170.         IF Not(pi96base) THEN pi96base:=OpenLibrary('Picasso96API.library',0)
  1171.         IF pi96base=0
  1172.             messagefmt(-1,cat.msg_Nolib.getstr(),'Picasso96API.library')
  1173.         ENDIF
  1174.     CASE $00000000 /*aga*/
  1175.         IF cybergfxbase
  1176.             CloseLibrary(cybergfxbase)
  1177.             cybergfxbase:=0
  1178.         ENDIF
  1179.         IF pi96base
  1180.             CloseLibrary(pi96base)
  1181.             pi96base:=0
  1182.         ENDIF
  1183.     DEFAULT
  1184.         message(-1,cat.msgm_UnknownMode.getstr())
  1185.         IF cybergfxbase
  1186.             CloseLibrary(cybergfxbase)
  1187.             cybergfxbase:=0
  1188.         ENDIF
  1189.         IF pi96base
  1190.             CloseLibrary(pi96base)
  1191.             pi96base:=0
  1192.         ENDIF
  1193.     ENDSELECT
  1194.  
  1195.     initfuncs({getdata},data,pi96base) -> initialization of parser.m
  1196.  
  1197. ENDPROC MUI_TRUE
  1198.  
  1199. PROC projectList_dispose(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO msg)
  1200. DEF worknode:PTR TO project_Node, nextnode,exec_list:PTR TO lh,data:PTR TO projectList_data
  1201.     data:=INST_DATA(cl,obj)
  1202.     exec_list:=data.exec_list
  1203.     worknode:=exec_list.head  -> First node
  1204.     IF worknode
  1205.         WHILE nextnode:=worknode.ln.succ
  1206.             END worknode;worknode:=nextnode
  1207.         ENDWHILE
  1208.     ENDIF
  1209. ENDPROC doSuperMethodA(cl,obj,msg)
  1210.  
  1211. PROC projectList_newitem(cl:PTR TO iclass,obj:PTR TO object/*,msg:PTR TO msg*/)
  1212. DEF window, pfunc,vscroll,hscroll,pid,
  1213. name:PTR TO CHAR,node:PTR TO project_Node,inlist:PTR TO CHAR,
  1214. exec_list:PTR TO lh,data:PTR TO projectList_data,
  1215. pdata:PTR TO planeFunc_data
  1216.  
  1217.     data:=INST_DATA(cl,obj);exec_list:=data.exec_list
  1218.     NEW node
  1219.     window:=WindowObject,
  1220.         MUIA_Window_ScreenTitle, PICVERSION,
  1221.         ->MUIA_Window_UseRightBorderScroller,MUI_TRUE,
  1222.         MUIA_Window_UseBottomBorderScroller,MUI_TRUE,
  1223.         WindowContents,
  1224.             HGroup,
  1225.                 MUIA_Group_Spacing,0,
  1226.                 Child, pfunc:=PlaneFuncObject,End,
  1227.                 Child, vscroll:=ScrollbarObject,
  1228.                     MUIA_FixWidth,20,
  1229.                     ->MUIA_Prop_UseWinBorder,MUIV_Prop_UseWinBorder_Right, /*This is an MUI bug, the refreshing is not done correctely when having a scroller in the right border..*/
  1230.                     MUIA_Prop_Entries,255,MUIA_Prop_Visible,255,
  1231.                 End,
  1232.                 Child, hscroll:=ScrollbarObject,
  1233.                     MUIA_Prop_UseWinBorder,MUIV_Prop_UseWinBorder_Bottom,
  1234.                     MUIA_Prop_Entries,255,MUIA_Prop_Visible,255,
  1235.                 End,
  1236.             End,
  1237.         End
  1238.  
  1239.     set(vscroll,MUIA_Prop_Entries,255) -> This is again an mui bug :-(
  1240.     set(hscroll,MUIA_Prop_Entries,255)
  1241.  
  1242.     doMethodA(app,[OM_ADDMEMBER,window])  /* now the project window is ready;*/
  1243.     get(pfunc,MUIA_PlaneFunc_Name,{name}) /* the PlaneFunc class has also initialised.*/
  1244.     set(window,MUIA_Window_Title,name) -> Read the default PlaneFunc name
  1245.     pdata:=INST_DATA(cl_planefunc.mcc_class,pfunc)
  1246.     pdata.hscroll:=hscroll
  1247.     pdata.vscroll:=vscroll
  1248.     doMethodA(hscroll,[MUIM_Notify,MUIA_Prop_First,MUIV_EveryTime,pfunc,3,MUIM_Set,MUIA_PlaneFunc_Left,MUIV_TriggerValue])
  1249.     doMethodA(vscroll,[MUIM_Notify,MUIA_Prop_First,MUIV_EveryTime,pfunc,3,MUIM_Set,MUIA_PlaneFunc_Top,MUIV_TriggerValue])
  1250.     doMethodA(window,[MUIM_Notify,MUIA_Window_CloseRequest,MUI_TRUE,pfunc,1,MUIM_PlaneFunc_Close])
  1251.     node.window:=window
  1252.     node.ln.name:=name
  1253.     node.ln.type:=PROJECTNODE_ID
  1254.     node.ln.pri:=0
  1255.     inlist:=String(40)
  1256.     node.item:=inlist
  1257.     get(pfunc,MUIA_PlaneFunc_ProjectID,{pid})
  1258.     node.pid:=pid
  1259.     AddTail(exec_list,node)
  1260.  
  1261.     set(pfunc,MUIA_PlaneFunc_ProjectNode,node)
  1262.  
  1263.     StringF(inlist,'\d :\s',lastid-1,name)
  1264.     doMethodA(obj,[MUIM_List_InsertSingle,inlist,MUIV_List_Insert_Bottom])
  1265.     set(window,MUIA_Window_Open,MUI_TRUE) -> Open the window when everything is finished
  1266.     set(obj,MUIA_List_Active,MUIV_List_Active_Bottom)
  1267. ENDPROC
  1268. PROC projectList_delitem(cl:PTR TO iclass,obj:PTR TO object/*,msg:PTR TO msg*/)
  1269. DEF data:PTR TO projectList_data,gad,window,state,
  1270.   node:PTR TO project_Node
  1271.  
  1272. quiet:=TRUE /*prevents the opened projects list from refreshing the display*/
  1273.     data:=INST_DATA(cl,obj)
  1274.     gad,window:=getcurrent(data,obj)
  1275.     doMethodA(gad,[MUIM_PlaneFunc_Abort,MUIV_PlaneFunc_Abort_Abort])/*aborts the task, if necessary*/
  1276.     get(gad,MUIA_PlaneFunc_ProjectNode,{node})
  1277.     get(gad,MUIA_PlaneFunc_State,{state})
  1278.     IF state = MUIV_PlaneFunc_State_Frozen
  1279.         message(node.pid,cat.msgm_RemVsFreeze.getstr())
  1280.         RETURN
  1281.     ENDIF
  1282.     doMethodA(obj,[MUIM_List_Remove,MUIV_List_Remove_Active])/*removes the name from the list*/
  1283.     DisposeLink(node.item)
  1284.     set(window,MUIA_Window_Open,FALSE)/*Closes the window*/
  1285.     doMethodA(app,[OM_REMMEMBER,window])
  1286.     Mui_DisposeObject(window) /*Removes the window and the PlaneFuncObject*/
  1287.     Remove(node)
  1288.     END node
  1289.     currid:=-1 -> This is to prevent projectList to change that unexistant project's priority
  1290. quiet:=FALSE
  1291.     doMethodA(obj,[MUIM_ProjectList_Refresh,0])
  1292. ENDPROC
  1293.  
  1294. PROC projectList_exit(cl:PTR TO iclass,obj:PTR TO object/*,msg:PTR TO msg*/)
  1295. DEF gad,data:PTR TO projectList_data,str[40]:STRING,pid
  1296. DEF exec_list:PTR TO lh,worknode:PTR TO project_Node,z,list:PTR TO mlh,cs:PTR TO object
  1297.     ->WriteF('Executing exit method...\n')
  1298.     data:=INST_DATA(cl,obj)
  1299.     exec_list:=data.exec_list
  1300.     worknode:=exec_list.head
  1301.     WHILE worknode.ln.succ
  1302.         get(worknode.window,MUIA_Window_RootObject,{z})
  1303.         get(z,MUIA_Group_ChildList,{list})
  1304.         cs:=list.head
  1305.         gad:=NextObject({cs})
  1306.         get(gad,MUIA_PlaneFunc_ProjectID,{pid})
  1307.         StringF(str,cat.msgm_Removing.getstr(),pid)
  1308.         message(-1,str)
  1309.         doMethodA(gad,[MUIM_PlaneFunc_Abort,MUIV_PlaneFunc_Abort_Abort])
  1310.         worknode:=worknode.ln.succ
  1311.     ENDWHILE
  1312. ENDPROC
  1313.  
  1314. /*This method reads all attributes of the current class and writes the state of the gadgets
  1315. in the settings window*/
  1316. PROC projectList_refresh(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO args_refresh)
  1317. DEF data:PTR TO projectList_data,nm:PTR TO CHAR,gad,value,q[11]:STRING,pid,win
  1318. DEF exec_list:PTR TO lh,worknode:PTR TO project_Node, count=0,ogad
  1319.  
  1320.     IF quiet=TRUE THEN RETURN
  1321.     data:=INST_DATA(cl,obj)
  1322.     gad,win:=getcurrent(data,obj)
  1323.     IF gad=NIL
  1324.         set(sgroup,MUIA_Disabled,MUI_TRUE)
  1325.         currid:=-1
  1326.         RETURN
  1327.     ENDIF
  1328.     set(sgroup,MUIA_Disabled,FALSE)
  1329.     get(gad,MUIA_PlaneFunc_ProjectID,{pid})
  1330.     IF pid <> currid /*was currid and will be pid*/
  1331.         IF currid > -1
  1332.             ogad:=getp(data,currid)
  1333.             doMethodA(ogad,[MUIM_PlaneFunc_SetTaskPri,rp])
  1334.         ENDIF
  1335.         doMethodA(gad,[MUIM_PlaneFunc_SetTaskPri,cp])
  1336.     ENDIF
  1337.  
  1338.     currid:=pid
  1339.     IF msg.ostate=FALSE
  1340.         doMethodA(gad,[MUIM_PlaneFunc_Lamps])
  1341.         StringF(q,'r(\d,x,y)=',pid)
  1342.         set(r_lbl,MUIA_Text_Contents,q)
  1343.         StringF(q,'g(\d,x,y)=',pid)
  1344.         set(g_lbl,MUIA_Text_Contents,q)
  1345.         StringF(q,'b(\d,x,y)=',pid)
  1346.         set(b_lbl,MUIA_Text_Contents,q)
  1347.         get(gad,MUIA_PlaneFunc_Name,{value})
  1348.         nnset(name_str,MUIA_String_Contents,value)   /*nnset to avoid triggering useless notification*/
  1349.         get(gad,MUIA_PlaneFunc_Type,{value})
  1350.         SELECT value
  1351.         CASE MUIV_PlaneFunc_Type_DTPic
  1352.             nnset(type_reg,MUIA_Group_ActivePage,0)
  1353.         CASE MUIV_PlaneFunc_Type_Graph
  1354.             nnset(type_reg,MUIA_Group_ActivePage,1)
  1355.         ENDSELECT
  1356.  
  1357.         get(gad,MUIA_PlaneFunc_LoadM,{value})  /* these are for image-projects*/
  1358.         SELECT value                           
  1359.         CASE MUIV_PlaneFunc_LoadM_Scale        /* but all settings are updated, so that */   
  1360.             nnset(size_rad,MUIA_Radio_Active,0)/* the user may change the selected page and*/
  1361.         CASE MUIV_PlaneFunc_LoadM_CutTile      /*see the current settings..*/                
  1362.             nnset(size_rad,MUIA_Radio_Active,1)
  1363.         CASE MUIV_PlaneFunc_LoadM_ChangeSize
  1364.             nnset(size_rad,MUIA_Radio_Active,2)
  1365.         ENDSELECT
  1366.         get(gad,MUIA_PlaneFunc_ImageFile,{value})
  1367.         nnset(path_str,MUIA_String_Contents,value)
  1368.  
  1369.         get(gad,MUIA_PlaneFunc_Rstr,{value})   /*these are for function-projects*/
  1370.         nnset(red_str,MUIA_String_Contents,value)
  1371.         get(gad,MUIA_PlaneFunc_Gstr,{value})
  1372.         nnset(green_str,MUIA_String_Contents,value)
  1373.         get(gad,MUIA_PlaneFunc_Bstr,{value})
  1374.         nnset(blue_str,MUIA_String_Contents,value)
  1375.         get(gad,MUIA_PlaneFunc_OutputR,{value})
  1376.         nnset(outr_cyc,MUIA_Cycle_Active,value)
  1377.         get(gad,MUIA_PlaneFunc_OutputG,{value})
  1378.         nnset(outg_cyc,MUIA_Cycle_Active,value)
  1379.         get(gad,MUIA_PlaneFunc_OutputB,{value})
  1380.         nnset(outb_cyc,MUIA_Cycle_Active,value)
  1381.  
  1382.  
  1383.         get(gad,MUIA_PlaneFunc_Width,{value})
  1384.         nnset(width_str,MUIA_String_Integer,value)
  1385.         get(gad,MUIA_PlaneFunc_Height,{value})
  1386.         nnset(height_str,MUIA_String_Integer,value)
  1387.         get(win,MUIA_Window_Open,{value})
  1388.         nnset(showme_cyc,MUIA_Cycle_Active,value)
  1389.     ENDIF
  1390.     IF (msg.ostate = FALSE) OR (msg.ostate-2=pid)
  1391.         setlamp(gad)
  1392.     ENDIF
  1393.     IF msg.ostate > 0
  1394.         pid:=msg.ostate-2
  1395.         gad:=getp(data,pid)
  1396.         get(gad,MUIA_PlaneFunc_Name,{nm})
  1397.         get(gad,MUIA_PlaneFunc_State,{value})
  1398.         IF (value=MUIV_PlaneFunc_State_Drawing) OR (value=MUIV_PlaneFunc_State_Loading)
  1399.             value:=33
  1400.         ELSE
  1401.             value:=32
  1402.         ENDIF
  1403.  
  1404.         exec_list:=data.exec_list
  1405.         worknode:=exec_list.head
  1406.         WHILE worknode.pid <> pid
  1407.             count++
  1408.             worknode:=worknode.ln.succ
  1409.         ENDWHILE
  1410.  
  1411.         StringF(worknode.item,'\d\c:\s',pid,value,nm)
  1412.         doMethodA(obj,[MUIM_List_Redraw,count])
  1413.     ENDIF
  1414. ENDPROC
  1415.  
  1416. PROC setlamp(gad:PTR TO object)
  1417. DEF value
  1418.     get(gad,MUIA_PlaneFunc_State,{value})
  1419.     SELECT value
  1420.     CASE MUIV_PlaneFunc_State_Idle
  1421.         set(state_txt,MUIA_Text_Contents,cat.msgs_Idle.getstr())
  1422.         set(lamp_lmp,MUIA_Lamp_Color,MUIV_Lamp_Color_Off)
  1423.         set(state_gau,MUIA_Gauge_Current,0)
  1424.         set(draw_btn,MUIA_Text_Contents,cat.msgl_Render.getstr())
  1425.     CASE MUIV_PlaneFunc_State_Drawing
  1426.         set(state_txt,MUIA_Text_Contents,cat.msgs_Drawing.getstr())
  1427.         set(lamp_lmp,MUIA_Lamp_Color,MUIV_Lamp_Color_Processing)
  1428.         get(gad,MUIA_PlaneFunc_Percent,{value})
  1429.         set(state_gau,MUIA_Gauge_Current,value)
  1430.         set(draw_btn,MUIA_Text_Contents,cat.msgl_Pause.getstr())
  1431.     CASE MUIV_PlaneFunc_State_Loading
  1432.         set(state_txt,MUIA_Text_Contents,cat.msgs_Loading.getstr())
  1433.         set(lamp_lmp,MUIA_Lamp_Color,MUIV_Lamp_Color_LoadingData)
  1434.         get(gad,MUIA_PlaneFunc_Percent,{value})
  1435.         set(state_gau,MUIA_Gauge_Current,value)
  1436.         set(draw_btn,MUIA_Text_Contents,cat.msgl_Pause.getstr())
  1437.     CASE MUIV_PlaneFunc_State_Paused
  1438.         set(state_txt,MUIA_Text_Contents,cat.msgs_Paused.getstr())
  1439.         set(lamp_lmp,MUIA_Lamp_Color,MUIV_Lamp_Color_Ok)
  1440.         get(gad,MUIA_PlaneFunc_Percent,{value})
  1441.         set(state_gau,MUIA_Gauge_Current,value)
  1442.         set(draw_btn,MUIA_Text_Contents,cat.msgl_Restart.getstr())
  1443.     CASE MUIV_PlaneFunc_State_Frozen
  1444.         set(state_txt,MUIA_Text_Contents,cat.msgs_Frozen.getstr())
  1445.         set(lamp_lmp,MUIA_Lamp_Color,MUIV_Lamp_Color_SendingData)
  1446.         set(state_gau,MUIA_Gauge_Current,0)
  1447.         set(draw_btn,MUIA_Text_Contents,cat.msgl_Render.getstr())
  1448.     ENDSELECT
  1449. ENDPROC
  1450.  
  1451. PROC projectList_setpri(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO args_setpri)
  1452. DEF data:PTR TO projectList_data,task,
  1453. gad
  1454. DEF worknode:PTR TO project_Node, nextnode,exec_list:PTR TO lh,list:PTR TO mlh,cs:PTR TO object,z
  1455.     data:=INST_DATA(cl,obj)
  1456.     task:=msg.task
  1457.     SELECT task
  1458.     CASE MUIV_ProjectList_SetPri_Main
  1459.         SetTaskPri(FindTask(0),msg.value)
  1460.     CASE MUIV_ProjectList_SetPri_Render
  1461.         rp:=msg.value
  1462.  
  1463.         exec_list:=data.exec_list
  1464.         worknode:=exec_list.head  -> First node
  1465.         IF worknode
  1466.             WHILE nextnode:=worknode.ln.succ
  1467.                 IF worknode.pid <> currid
  1468.                     get(worknode.window,MUIA_Window_RootObject,{z})
  1469.                     get(z,MUIA_Group_ChildList,{list})
  1470.                     cs:=list.head
  1471.                     gad:=NextObject({cs})
  1472.                     doMethodA(gad,[MUIM_PlaneFunc_SetTaskPri,rp])
  1473.                 ENDIF
  1474.                 worknode:=nextnode
  1475.             ENDWHILE
  1476.         ENDIF
  1477.  
  1478.     CASE MUIV_ProjectList_SetPri_Curr
  1479.         cp:=msg.value
  1480.         gad:=getcurrent(data,obj)
  1481.         IF gad
  1482.             doMethodA(gad,[MUIM_PlaneFunc_SetTaskPri,cp])
  1483.         ENDIF
  1484.     ENDSELECT
  1485. ENDPROC
  1486.  
  1487. PROC projectList_notify(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO args_notify)
  1488. DEF data:PTR TO projectList_data,gadid,z,gad,value,pid,node:PTR TO project_Node
  1489.     data:=INST_DATA(cl,obj)
  1490.     gad:=getcurrent(data,obj)
  1491.     value:=msg.value
  1492.     gadid:=msg.gadget
  1493.     SELECT gadid
  1494.     CASE MUIV_ProjectList_Notify_Name
  1495.         set(gad,MUIA_PlaneFunc_Name,value)
  1496.         get(gad,MUIA_PlaneFunc_State,{z})
  1497.         IF (z=MUIV_PlaneFunc_State_Drawing) OR (value=MUIV_PlaneFunc_State_Loading)
  1498.             z:=33
  1499.         ELSE
  1500.             z:=32
  1501.         ENDIF
  1502.         get(gad,MUIA_PlaneFunc_ProjectID,{pid})
  1503.         get(gad,MUIA_PlaneFunc_ProjectNode,{node})
  1504.         StringF(node.item,'\d\c:\s',pid,z,value)
  1505.         doMethodA(obj,[MUIM_List_Redraw,MUIV_List_Redraw_Active])
  1506.     CASE MUIV_ProjectList_Notify_Type
  1507.         SELECT value
  1508.         CASE 0
  1509.             set(gad,MUIA_PlaneFunc_Type,MUIV_PlaneFunc_Type_DTPic)
  1510.         CASE 1
  1511.             set(gad,MUIA_PlaneFunc_Type,MUIV_PlaneFunc_Type_Graph)
  1512.         ENDSELECT
  1513.     CASE MUIV_ProjectList_Notify_ImageFile
  1514.         set(gad,MUIA_PlaneFunc_ImageFile,value)
  1515.     CASE MUIV_ProjectList_Notify_LoadM
  1516.         SELECT value
  1517.         CASE 0
  1518.             set(gad,MUIA_PlaneFunc_LoadM,MUIV_PlaneFunc_LoadM_Scale)
  1519.         CASE 1
  1520.             set(gad,MUIA_PlaneFunc_LoadM,MUIV_PlaneFunc_LoadM_CutTile)
  1521.         CASE 2
  1522.             set(gad,MUIA_PlaneFunc_LoadM,MUIV_PlaneFunc_LoadM_ChangeSize)
  1523.         ENDSELECT
  1524.     CASE MUIV_ProjectList_Notify_Red
  1525.         set(gad,MUIA_PlaneFunc_Rstr,value)
  1526.     CASE MUIV_ProjectList_Notify_Green
  1527.         set(gad,MUIA_PlaneFunc_Gstr,value)
  1528.     CASE MUIV_ProjectList_Notify_Blue
  1529.         set(gad,MUIA_PlaneFunc_Bstr,value)
  1530.     CASE MUIV_ProjectList_Notify_OutputR
  1531.         set(gad,MUIA_PlaneFunc_OutputR,value)
  1532.     CASE MUIV_ProjectList_Notify_OutputG
  1533.         set(gad,MUIA_PlaneFunc_OutputG,value)
  1534.     CASE MUIV_ProjectList_Notify_OutputB
  1535.         set(gad,MUIA_PlaneFunc_OutputB,value)
  1536.     CASE MUIV_ProjectList_Notify_Width
  1537.         set(gad,MUIA_PlaneFunc_Width,Val(value))
  1538.     CASE MUIV_ProjectList_Notify_Height
  1539.         set(gad,MUIA_PlaneFunc_Height,Val(value))
  1540.     ENDSELECT
  1541. ENDPROC
  1542.  
  1543. PROC projectList_prefs(msg:PTR TO args_prefs)
  1544.     ObtainSemaphore(psema)
  1545.     msg.var[]:=msg.value
  1546.     ReleaseSemaphore(psema)
  1547. ENDPROC
  1548.  
  1549. PROC projectList_forward(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO args_forward)
  1550. DEF gad,data:PTR TO projectList_data
  1551.     data:=INST_DATA(cl,obj)
  1552.     gad:=getcurrent(data,obj)
  1553.     IF msg.method=MUIM_PlaneFunc_Abort
  1554.         doMethodA(gad,[MUIM_PlaneFunc_Abort,MUIV_PlaneFunc_Abort_Abort])
  1555.     ELSE
  1556.         doMethodA(gad,[msg.method])
  1557.     ENDIF
  1558. ENDPROC
  1559. PROC projectList_showme(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO args_showme)
  1560. DEF win,data:PTR TO projectList_data
  1561. DEF exec_list:PTR TO lh,active,worknode:PTR TO project_Node,z->,qe[30]:STRING
  1562.  
  1563.     data:=INST_DATA(cl,obj)
  1564.  
  1565.     exec_list:=data.exec_list
  1566.     get(obj,MUIA_List_Active,{active})
  1567.     /*get item number "active" of the exec_list (isn't any faster way to do it?)*/
  1568.     worknode:=exec_list.head
  1569.               /* I should add here a check that the bound of the list is never reached!*/
  1570.     IF active > 0
  1571.         FOR z:=1 TO active DO worknode:=worknode.ln.succ
  1572.     ENDIF -> now worknode is the node of the wanted project
  1573.     win:=worknode.window
  1574.     set(win,MUIA_Window_Open,msg.value)
  1575.     /*StringF(qe,'set(\d,MUIA_Window_Open,\d)',win,msg.value)
  1576.     message(active,qe)*/
  1577. ENDPROC
  1578.  
  1579. /***************************************************************
  1580. ** custom uSlider private subclass of Slider class            **
  1581. ****************************************************************
  1582. *                                                              *
  1583. *Simple sub-class of Slider, overriding MUIM_Numeric_Stringify *
  1584. *                                                              *
  1585. ***************************************************************/
  1586. PROC uslider_dispatcher(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO muip_numeric_stringify)
  1587. DEF data:PTR TO uslider_data,methodid
  1588.     methodid:=msg.methodid
  1589.     SELECT methodid
  1590.     CASE OM_NEW;RETURN uslider_new(cl,obj,msg)
  1591.     CASE MUIM_Numeric_Stringify
  1592.         data:=INST_DATA(cl,obj)
  1593.         IF data.stringify=MUI_TRUE
  1594.             IF msg.value = 0
  1595.                 StrCopy(data.buffer,cat.msgp_guNone.getstr())
  1596.             ELSEIF msg.value=1
  1597.                 StringF(data.buffer,'\d \s',msg.value,cat.msgp_Pixel.getstr())
  1598.             ELSE
  1599.                 StringF(data.buffer,'\d \s',msg.value,cat.msgp_Pixels.getstr())
  1600.             ENDIF
  1601.             RETURN data.buffer
  1602.         ENDIF
  1603.     CASE MUIM_uSlider_Bigger;RETURN uslider_bigger(obj,msg)
  1604.     CASE MUIM_uSlider_Smaller;RETURN uslider_smaller(obj,msg)
  1605.     CASE MUIM_Cleanup
  1606.         data:=INST_DATA(cl,obj)
  1607.         IF data.stringify THEN
  1608.             DisposeLink(data.buffer)
  1609.     ENDSELECT
  1610. ENDPROC doSuperMethodA(cl,obj,msg)
  1611.  
  1612. PROC uslider_new(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO opset)
  1613. DEF data:PTR TO uslider_data,
  1614.     tags:PTR TO tagitem,
  1615.     tag:PTR TO tagitem
  1616.  
  1617.     IF (obj:=doSuperMethodA(cl,obj,msg))=NIL THEN RETURN 0
  1618.  
  1619.     data:=INST_DATA(cl,obj)
  1620.     tags:=msg.attrlist
  1621.     WHILE tag:=NextTagItem({tags})
  1622.         IF tag.tag=MUIA_uSlider_Stringify
  1623.             data.stringify:=tag.data
  1624.             data.buffer:=String(10)
  1625.         ENDIF
  1626.     ENDWHILE
  1627. ENDPROC obj
  1628.  
  1629. PROC uslider_bigger(obj:PTR TO object,msg:PTR TO args_compare)
  1630. DEF level
  1631.     get(obj,MUIA_Slider_Level,{level})
  1632.     IF level < msg.than THEN
  1633.         nnset(obj,MUIA_Slider_Level,msg.than)
  1634. ENDPROC
  1635.  
  1636. PROC uslider_smaller(obj:PTR TO object,msg:PTR TO args_compare)
  1637. DEF level
  1638.     get(obj,MUIA_Slider_Level,{level})
  1639.     IF level > msg.than THEN
  1640.         nnset(obj,MUIA_Slider_Level,msg.than)
  1641. ENDPROC
  1642.  
  1643. /***************************************************************
  1644. ** sizetxt class                                              **
  1645. ****************************************************************
  1646. *  textobject containing the size of the last loaded picture.  *
  1647. ***************************************************************/
  1648.  
  1649. OBJECT sizetxt_data
  1650.     buffer:PTR TO CHAR
  1651. ENDOBJECT
  1652.  
  1653. CONST MUIM_SizeTxt_Update=$FCB93800
  1654.  
  1655. OBJECT muip_stupd
  1656.     methodid
  1657.     width,height,depth
  1658.     projectid
  1659. ENDOBJECT
  1660.  
  1661. PROC sizetxt_dispatcher(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO msg)
  1662. DEF methodid
  1663.     methodid:=msg.methodid
  1664.     SELECT methodid
  1665.     CASE OM_NEW;RETURN sizetxt_new(cl,obj,msg)
  1666.     CASE OM_DISPOSE;RETURN sizetxt_dispose(cl,obj,msg)
  1667.     CASE MUIM_SizeTxt_Update;RETURN sizetxt_update(cl,obj,msg)
  1668.     ENDSELECT
  1669. ENDPROC doSuperMethodA(cl,obj,msg)
  1670.  
  1671. PROC sizetxt_new(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO msg)
  1672. DEF data:PTR TO sizetxt_data
  1673.     obj:=doSuperMethodA(cl,obj,msg)
  1674.     data:=INST_DATA(cl,obj)
  1675.     data.buffer:=String(50)
  1676. ENDPROC obj
  1677.  
  1678. PROC sizetxt_dispose(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO msg)
  1679. DEF data:PTR TO sizetxt_data
  1680.     data:=INST_DATA(cl,obj)
  1681.     DisposeLink(data.buffer)
  1682. ENDPROC doSuperMethodA(cl,obj,msg)
  1683.  
  1684. PROC sizetxt_update(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO muip_stupd)
  1685. DEF data:PTR TO sizetxt_data
  1686.     data:=INST_DATA(cl,obj)
  1687.     IF msg.projectid = currid
  1688.         StringF(data.buffer,'\s\d×\d×\d',cat.msgl_PicSize.getstr(),msg.width,msg.height,msg.depth)
  1689.         set(obj,MUIA_Text_Contents,data.buffer)
  1690.     ENDIF
  1691. ENDPROC
  1692.  
  1693. PROC myapp_dispatcher(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO muip_application_returnid)
  1694.     ->WriteF('$\h\n',msg.methodid)
  1695.     IF msg.methodid=MUIM_Application_ReturnID
  1696.         IF msg.retid=MUIV_Application_ReturnID_Quit THEN /*separate IFs to avoid illegal memory access, if the message hasn't any argument*/
  1697.             doMethodA(opened_lst,[MUIM_ProjectList_Exit]) -> This will cause the Exit method to be executed right before
  1698.     ENDIF                                           -> ReturnId (when called with Exit returnid)
  1699. ENDPROC doSuperMethodA(cl,obj,msg)
  1700.  
  1701. /***************************************************************
  1702. ** Functions for easy and secure spawning/killing of subtasks **
  1703. ***************************************************************/
  1704.  
  1705. PROC sendsubtaskmsg(st:PTR TO subtask,command,params)
  1706.   st.st_Message.stm_Message.replyport:= st.st_Reply
  1707.   st.st_Message.stm_Message.length   := SIZEOF subtaskmsg
  1708.   st.st_Message.stm_Command          := command
  1709.   st.st_Message.stm_Parameter        := params
  1710.   st.st_Message.stm_Result           := 0
  1711.  
  1712.   PutMsg(IF command=STC_STARTUP THEN st.st_Task::process.msgport ELSE st.st_Port,st.st_Message)
  1713.   WaitPort(st.st_Reply)          /*gets the reply*/
  1714.   GetMsg(st.st_Reply)
  1715. ENDPROC (st.st_Message.stm_Result)
  1716.  
  1717. PROC spawnsubtask(name,func,data:PTR TO planeFunc_data)
  1718.     DEF st=NIL:PTR TO subtask
  1719.  
  1720.     IF (st:=AllocVec(SIZEOF subtask,MEMF_PUBLIC OR MEMF_CLEAR))
  1721.         st.st_Reply:=CreateMsgPort()
  1722.         IF (st.st_Reply)
  1723.             st.st_Data:=data
  1724.             st.st_Task:= CreateNewProc([NP_ENTRY,func,
  1725.                                         NP_NAME,name,
  1726.                                         TAG_DONE])
  1727.             IF (st.st_Task)
  1728.                 IF (sendsubtaskmsg(st,STC_STARTUP,st)) THEN RETURN (st)
  1729.             ENDIF
  1730.             DeleteMsgPort(st.st_Reply)
  1731.         ENDIF
  1732.         FreeVec(st)
  1733.     ENDIF
  1734. ENDPROC
  1735.  
  1736. PROC killsubtask(st:PTR TO subtask)
  1737.     sendsubtaskmsg(st,STC_SHUTDOWN,st)
  1738.     DeleteMsgPort(st.st_Reply)
  1739.     FreeVec(st)
  1740. ENDPROC
  1741.  
  1742. /*exitsubtask and initsubtask are called from the subtask*/
  1743. PROC exitsubtask(st:PTR TO subtask,stm:PTR TO subtaskmsg)
  1744.   /*
  1745.   ** We reply after a Forbid() to make sure we're really gone
  1746.   ** when the main task continues.
  1747.   */
  1748.   IF (st.st_Port) THEN DeleteMsgPort(st.st_Port)
  1749.   Forbid()
  1750.   stm.stm_Result:= FALSE
  1751.   ReplyMsg(stm)
  1752. ENDPROC
  1753.  
  1754. PROC initsubtask()
  1755.   DEF me=NIL:PTR TO tc,
  1756.       st=NIL:PTR TO subtask,
  1757.       stm=NIL:PTR TO subtaskmsg
  1758.  
  1759.   me:= FindTask(NIL)
  1760.  
  1761.   /*
  1762.   ** Wait for our startup message from the SpawnSubTask() function.
  1763.   */
  1764.  
  1765.   WaitPort(me::process.msgport)
  1766.   stm:= GetMsg(me::process.msgport)
  1767.   st:= stm.stm_Parameter
  1768.   st.st_Port:=CreateMsgPort()
  1769.   IF (st.st_Port)
  1770.     /*
  1771.     ** Reply startup message, everything ok.
  1772.     ** Note that if the initialization fails, the code falls
  1773.     ** through and replies the startup message with a stm_Result
  1774.     ** of 0 after a Forbid(). This tells SpawnSubTask() that the
  1775.     ** sub task failed to run.
  1776.     */
  1777.     stm.stm_Result:= TRUE
  1778.     ReplyMsg(stm)
  1779.     RETURN (st)
  1780.   ELSE
  1781.     exitsubtask(st,stm)
  1782.     RETURN (NIL)
  1783.   ENDIF
  1784. ENDPROC
  1785.  
  1786. /***************************************************************
  1787. **    Subtask which does all the time-consuming rendering     **
  1788. ***************************************************************/
  1789.  
  1790. PROC renderfunc()
  1791. DEF st=NIL:PTR TO subtask,
  1792.     data=NIL:PTR TO planeFunc_data,lrupd,
  1793.     running=TRUE,worktodo=FALSE,x,y,
  1794.     stm=NIL:PTR TO subtaskmsg,
  1795.     command,
  1796.     red,green,blue,lr:PTR TO longreal,cnt=0,
  1797.     rproc,gproc,bproc,oldpixel
  1798.  
  1799.     geta4() -> !!!
  1800.  
  1801.     IF (st:= initsubtask())
  1802.         data:= st.st_Data
  1803.         LOOP
  1804.             /*
  1805.             ** after the sub task is up and running, we go into
  1806.             ** a loop and process the messages from the main task.
  1807.             */
  1808.             WHILE (stm:= GetMsg(st.st_Port))
  1809.                 command:=stm.stm_Command
  1810.                 SELECT command
  1811.                 CASE STC_SHUTDOWN
  1812.                     /*
  1813.                     ** This is the shutdown message from KillSubTask().
  1814.                     */
  1815.                     running:= FALSE
  1816.                 CASE STC_START
  1817.                     ObtainSemaphore(data.sema)
  1818.                     data.drawn:=-1
  1819.                     data.calculated:=-1
  1820.                     DateStamp(data.ds)
  1821.                     ReleaseSemaphore(data.sema)
  1822.  
  1823.                     ObtainSemaphore(psema)
  1824.                     lrupd:=rupd
  1825.                     ReleaseSemaphore(psema)
  1826.  
  1827.                     y:=0
  1828.                     NEW lr
  1829.                     worktodo:= TRUE
  1830.                     rproc:=data.rfunc.proc()
  1831.                     gproc:=data.gfunc.proc()
  1832.                     bproc:=data.bfunc.proc()
  1833.                 CASE STC_PAUSE
  1834.                     worktodo:= FALSE
  1835.                 CASE STC_RESTART -> Deactivate pause
  1836.                     worktodo:=TRUE
  1837.                 ENDSELECT
  1838.                 /*
  1839.                 ** If we received a shutdown message, we do not reply it
  1840.                 ** immediately. First, we need to free our resources.
  1841.                 */
  1842.                 IF (running=FALSE) THEN JUMP exit
  1843.                 ReplyMsg(stm.stm_Message)
  1844.             ENDWHILE
  1845.             IF (running=FALSE) THEN JUMP exit
  1846.             IF (worktodo)
  1847.                 /* if there is work to do, i.e. if the rendering is not
  1848.                    finished yet, we calculate the next line and draw
  1849.                    it to the offscreen rastport.*/
  1850.                 ObtainSemaphore(data.sema)
  1851.  
  1852.                 rproc(-1,y,lr,data.rfunc)
  1853.                 gproc(-1,y,lr,data.gfunc)
  1854.                 bproc(-1,y,lr,data.bfunc)
  1855.  
  1856.                 FOR x:=0 TO data.width
  1857.                     IF data.savepixel THEN
  1858.                         oldpixel:=ReadRGBPixel(data.rp,x,y)
  1859.  
  1860.                     IF data.outputr=OUT_Integer      /*red*/
  1861.                         red:=rproc(x,y,lr,data.rfunc)
  1862.                         red:=modt(red)
  1863.                         red:=Shl(red,16)
  1864.                     ELSEIF data.outputr=OUT_Float32
  1865.                         red:=!rproc(x,y,lr,data.rfunc)!
  1866.                         red:=modt(red)
  1867.                         red:=Shl(red,16)
  1868.                     ELSEIF data.outputr=OUT_Float64
  1869.                         rproc(x,y,lr,data.rfunc)
  1870.                         red:=dFix(lr)
  1871.                         red:=modt(red)
  1872.                         red:=Shl(red,16)
  1873.                     ELSEIF data.outputr=OUT_OldR
  1874.                         red:=oldpixel AND $FF0000
  1875.                     ELSEIF data.outputr=OUT_OldG
  1876.                         red:=Shl(oldpixel AND $FF00,8)
  1877.                     ELSE /*IF data.outputr=OUT_OldB*/
  1878.                         red:=Shl(oldpixel AND $FF,16)
  1879.                     ENDIF
  1880.                     IF data.outputg=OUT_Integer      /*green*/
  1881.                         green:=gproc(x,y,lr,data.gfunc)
  1882.                         green:=modt(green)
  1883.                         green:=Shl(green,8)
  1884.                     ELSEIF data.outputg=OUT_Float32
  1885.                         green:=!gproc(x,y,lr,data.gfunc)!
  1886.                         green:=modt(green)
  1887.                         green:=Shl(green,8)
  1888.                     ELSEIF data.outputg=OUT_Float64
  1889.                         gproc(x,y,lr,data.gfunc)
  1890.                         green:=dFix(lr)
  1891.                         green:=modt(green)
  1892.                         green:=Shl(green,8)
  1893.                     ELSEIF data.outputg=OUT_OldR
  1894.                         green:=Shr(oldpixel AND $FF0000,8)
  1895.                     ELSEIF data.outputg=OUT_OldG
  1896.                         green:=oldpixel AND $FF00
  1897.                     ELSEIF data.outputg=OUT_OldB
  1898.                         green:=Shl(oldpixel AND $FF,8)
  1899.                     ELSE /*IF data.outputr=OUT_CopyR*/
  1900.                         green:=Shr(red,8)
  1901.                     ENDIF
  1902.                     IF data.outputb=OUT_Integer      /*blue*/
  1903.                         blue:=bproc(x,y,lr,data.bfunc)
  1904.                         blue:=modt(blue)
  1905.                     ELSEIF data.outputb=OUT_Float32
  1906.                         blue:=!bproc(x,y,lr,data.bfunc)!
  1907.                         blue:=modt(blue)
  1908.                     ELSEIF data.outputb=OUT_Float64
  1909.                         bproc(x,y,lr,data.bfunc)
  1910.                         blue:=dFix(lr)
  1911.                         blue:=modt(blue)
  1912.                     ELSEIF data.outputb=OUT_OldR
  1913.                         blue:=Shr(oldpixel,16)
  1914.                     ELSEIF data.outputb=OUT_OldG
  1915.                         blue:=Shr(oldpixel,8) AND $FF
  1916.                     ELSEIF data.outputb=OUT_OldB
  1917.                         blue:=oldpixel AND $FF
  1918.                     ELSEIF data.outputb=OUT_CopyR
  1919.                         blue:=Shr(red,16)
  1920.                     ELSE /*IF data.outputb=OUT_CopyG*/
  1921.                         blue:=Shr(green,8)
  1922.                     ENDIF
  1923.                     IF cybergfxbase
  1924.                         WriteRGBPixel(data.rp,x,y,red+green+blue)
  1925.                     ELSE
  1926.                         Pi96WritePixel(data.rp,x,y,red+green+blue)
  1927.                     ENDIF
  1928.                 ENDFOR
  1929.                 ReleaseSemaphore(data.sema)
  1930.                 ObtainSemaphore(data.sema)
  1931.                 /*
  1932.                 ** after the line is finished, we set the corresponding
  1933.                 ** flag in the line update array to FALSE. This shows the
  1934.                 ** main task that this line needs to be redrawn the next
  1935.                 ** time it gets the chance.
  1936.                 */
  1937.                 data.calculated:=y
  1938.                 IF lrupd
  1939.                     IF cnt=0
  1940.                         IF (data.app) THEN
  1941.                             doMethodA(data.app,[MUIM_Application_PushMethod,data.self,1,MUIM_PlaneFunc_Update])
  1942.                         cnt:=lrupd
  1943.                     ELSE ; cnt--
  1944.                     ENDIF
  1945.                 ENDIF
  1946.                 ReleaseSemaphore(data.sema)
  1947.                 y++
  1948.                 IF (y=data.height)
  1949.                     /* check if we are finished to draw our picture */
  1950.                      worktodo:= FALSE
  1951.                     /*if we're finished, we ask the main task to exit ourselves..*/
  1952.                     IF (data.app)
  1953.                         doMethodA(data.app,[MUIM_Application_PushMethod,data.self,1,MUIM_PlaneFunc_Update])
  1954.                         doMethodA(data.app,[MUIM_Application_PushMethod,data.self,2,MUIM_PlaneFunc_Abort,MUIV_PlaneFunc_Abort_Finish])
  1955.                     ENDIF
  1956.                 ENDIF
  1957.                 /* Since we are very busy working, we do not Wait() for signals. */
  1958.             ELSE
  1959.                 /* We have nothing to do, just sit quietly and wait for something to happen */
  1960.                 WaitPort(st.st_Port)
  1961.             ENDIF
  1962.         ENDLOOP
  1963.         END lr
  1964. exit:
  1965.         exitsubtask(st,stm)
  1966.     ENDIF
  1967. ENDPROC
  1968.  
  1969. PROC loadpicture()
  1970. DEF pic:PTR TO super_picture,file:PTR TO CHAR,tbmp:PTR TO trueBitmap
  1971. DEF st=NIL:PTR TO subtask,
  1972.     lrupd,
  1973.     data=NIL:PTR TO planeFunc_data,
  1974.     running=TRUE,worktodo=FALSE,changedone=TRUE,
  1975.     x,y,
  1976.     stm=NIL:PTR TO subtaskmsg,
  1977.     command,
  1978.     cnt=0,init=2
  1979.  
  1980.     geta4()
  1981.     IF (st:= initsubtask())
  1982.         data:=st.st_Data
  1983.         LOOP
  1984.             WHILE (stm:= GetMsg(st.st_Port))
  1985.                 command:=stm.stm_Command
  1986.                 SELECT command
  1987.                 CASE STC_SHUTDOWN
  1988.                     running:= FALSE
  1989.                 CASE STC_START
  1990.                     ObtainSemaphore(data.sema)
  1991.                     data.drawn:=-1
  1992.                     data.calculated:=-1
  1993.                     DateStamp(data.ds)
  1994.                     ReleaseSemaphore(data.sema)
  1995.                     ObtainSemaphore(psema)
  1996.                     lrupd:=rupd
  1997.                     ReleaseSemaphore(psema)
  1998.                     worktodo:=TRUE
  1999.                     y:=0
  2000.                 CASE STC_PAUSE
  2001.                     worktodo:= FALSE
  2002.                 CASE STC_RESTART
  2003.                     worktodo:=TRUE
  2004.                 CASE STC_CHANGEDONE
  2005.                     changedone:=TRUE
  2006.                 ENDSELECT
  2007.                 IF (running=FALSE) THEN JUMP finish
  2008.                 ReplyMsg(stm.stm_Message)
  2009.             ENDWHILE
  2010.             IF (running=FALSE) THEN JUMP finish
  2011.             IF worktodo AND changedone
  2012.                 IF init = 2
  2013.                     NEW pic.super_picture(TRUE)
  2014.                     file:=data.imagefile
  2015.                     IF pic.load(file) <> 0  /*And if data.app=NIL ? :-)*/
  2016.                         doMethodA(data.app,[MUIM_Application_PushMethod,data.self,2,MUIM_PlaneFunc_Abort,MUIV_PlaneFunc_Abort_NoLoad])
  2017.                         worktodo:=FALSE
  2018.                     ELSE
  2019.                         ObtainSemaphore(data.sema) /*same as above :-)*/
  2020.                         IF data.loadm=MUIV_PlaneFunc_LoadM_ChangeSize
  2021.                             doMethodA(data.app,[MUIM_Application_PushMethod,data.self,3,
  2022.                                 MUIM_Set,MUIA_PlaneFunc_Quiet,-2])
  2023.                             doMethodA(data.app,[MUIM_Application_PushMethod,data.self,3,
  2024.                                 MUIM_Set,MUIA_PlaneFunc_Width,pic.width()])
  2025.                             doMethodA(data.app,[MUIM_Application_PushMethod,data.self,3,
  2026.                                 MUIM_Set,MUIA_PlaneFunc_Height,pic.height()])
  2027.                             doMethodA(data.app,[MUIM_Application_PushMethod,data.self,3,
  2028.                                 MUIM_Set,MUIA_PlaneFunc_Quiet,FALSE])
  2029.                             changedone:=FALSE
  2030.                         ENDIF
  2031.                         doMethodA(data.app,[MUIM_Application_PushMethod,size_txt,5,MUIM_SizeTxt_Update,
  2032.                             pic.width(),pic.height(),pic.depth(),data.projectid])
  2033.                         ReleaseSemaphore(data.sema)
  2034.                     ENDIF
  2035.                     init:=1
  2036.                 ELSEIF init = 1
  2037.                     IF (tbmp:=pic.trueconv()) = NIL
  2038.                         doMethodA(data.app,[MUIM_Application_PushMethod,data.self,2,MUIM_PlaneFunc_Abort,MUIV_PlaneFunc_Abort_NoLoad])
  2039.                         worktodo:=FALSE
  2040.                     ENDIF
  2041.                     doMethodA(data.app,[MUIM_Application_PushMethod,data.self,3,MUIM_Set,MUIA_PlaneFunc_Loading,FALSE])
  2042.                     init:=0
  2043.                 ELSE
  2044.                     ObtainSemaphore(data.sema)
  2045.                     IF data.loadm=MUIV_PlaneFunc_LoadM_Scale
  2046.                         IF cybergfxbase /*cgx*/
  2047.                             FOR x:=0 TO data.width
  2048.                                 WriteRGBPixel(data.rp,x,y,tbmp.readPixel(x*pic.width()/data.width,y*pic.height()/data.height))
  2049.                             ENDFOR
  2050.                         ELSE    /*picasso*/
  2051.                             FOR x:=0 TO data.width
  2052.                                 Pi96WritePixel(data.rp,x,y,tbmp.readPixel(x*pic.width()/data.width,y*pic.height()/data.height))
  2053.                             ENDFOR
  2054.                         ENDIF
  2055.                     ELSE
  2056.                         IF cybergfxbase /*cgx*/
  2057.                             FOR x:=0 TO data.width
  2058.                                 WriteRGBPixel(data.rp,x,y,tbmp.readPixel(Mod(x,pic.width()),Mod(y,pic.height())))
  2059.                             ENDFOR
  2060.                         ELSE    /*picasso*/
  2061.                             FOR x:=0 TO data.width
  2062.                                 Pi96WritePixel(data.rp,x,y,tbmp.readPixel(Mod(x,pic.width()),Mod(y,pic.height())))
  2063.                             ENDFOR
  2064.                         ENDIF
  2065.                     ENDIF
  2066.                     data.calculated:=y
  2067.                     IF lrupd
  2068.                         IF cnt=0
  2069.                             IF (data.app) THEN
  2070.                                 doMethodA(data.app,[MUIM_Application_PushMethod,data.self,1,MUIM_PlaneFunc_Update])
  2071.                             cnt:=lrupd
  2072.                         ELSE ; cnt--
  2073.                         ENDIF
  2074.                     ENDIF
  2075.                     ReleaseSemaphore(data.sema)
  2076.                     y++
  2077.                     IF (y=data.height)
  2078.                          worktodo:= FALSE
  2079.                         IF (data.app)
  2080.                             doMethodA(data.app,[MUIM_Application_PushMethod,data.self,1,MUIM_PlaneFunc_Update])
  2081.                             doMethodA(data.app,[MUIM_Application_PushMethod,data.self,2,MUIM_PlaneFunc_Abort,MUIV_PlaneFunc_Abort_Finish])
  2082.                         ENDIF
  2083.                     ENDIF
  2084.                 ENDIF
  2085.             ELSE
  2086.                 WaitPort(st.st_Port)
  2087.             ENDIF
  2088.         ENDLOOP
  2089. finish:
  2090.         END pic
  2091.         exitsubtask(st,stm)
  2092.     ENDIF
  2093. ENDPROC
  2094.  
  2095. /********************************
  2096. *   Inter-referencing...        *
  2097. ********************************/
  2098.  
  2099. /*freeze(function): this will read-lock all used functions.
  2100. returns true if success, or false if failure*/
  2101.  
  2102. PROC freeze(f:PTR TO function)
  2103. DEF a:PTR TO planeFunc_data,b,c,data:PTR TO projectList_data,obj,lock
  2104. DEF exec_list:PTR TO lh,worknode:PTR TO project_Node
  2105.     IF f.precision > OUT_Float64 THEN RETURN TRUE
  2106.     data:=INST_DATA(cl_projectlist.mcc_class,opened_lst)
  2107.  
  2108.     a,b,c:=f.reference()
  2109.     IF a > 3 -> direct reference to project "a" (a is the data of the object)
  2110.             /* + sub-functions "b" and "c"*/
  2111.         /*checks that a exists, searching it in the projects list*/
  2112.         data:=INST_DATA(cl_projectlist.mcc_class,opened_lst)
  2113.         exec_list:=data.exec_list
  2114.         worknode:=exec_list.head
  2115.         WHILE wcomp(worknode,a)
  2116.             worknode:=worknode.ln.succ
  2117.         ENDWHILE
  2118.         IF worknode.ln.succ = 0 -> a doesn't exist
  2119.             RETURN FALSE
  2120.         ENDIF
  2121.         obj:=a.self
  2122.         get(obj,MUIA_PlaneFunc_Lock,{lock})
  2123.         IF lock = MUIV_PlaneFunc_Lock_Write THEN RETURN FALSE
  2124.         set(obj,MUIA_PlaneFunc_Lock,MUIV_PlaneFunc_Lock_Read)
  2125.         IF freeze(b) = 0
  2126.             set(obj,MUIA_PlaneFunc_Lock,MUIV_PlaneFunc_Lock_NoRead)
  2127.             RETURN FALSE
  2128.         ENDIF
  2129.         IF freeze(c) = 0
  2130.             free(b) -> IF "c" can't be frozen, let's free "b" before returning
  2131.             set(obj,MUIA_PlaneFunc_Lock,MUIV_PlaneFunc_Lock_NoRead)
  2132.             RETURN FALSE
  2133.         ENDIF
  2134.         RETURN TRUE
  2135.     ENDIF
  2136.  
  2137.     SELECT a
  2138.     CASE 2 -> One sub-function : "b"
  2139.         IF freeze(b) = 0 THEN RETURN FALSE
  2140.     CASE 3 -> Two sub functions : "b" and "c"
  2141.         IF freeze(b) = 0 THEN RETURN FALSE
  2142.         IF freeze(c) = 0
  2143.             free(b) -> IF "c" can't be frozen, let's free "b" before returning
  2144.             RETURN FALSE
  2145.         ENDIF
  2146.     ENDSELECT
  2147. ENDPROC TRUE
  2148.  
  2149. PROC wcomp(node:PTR TO project_Node,data)
  2150.     IF node.ln.succ = 0 THEN RETURN FALSE
  2151. ENDPROC (wdata(node.window) <> data)
  2152.  
  2153. PROC wdata(window)
  2154. DEF gad,list:PTR TO mlh,cs:PTR TO object
  2155.     get(window,MUIA_Window_RootObject,{gad})
  2156.     get(gad,MUIA_Group_ChildList,{list})
  2157.     cs:=list.head
  2158. ENDPROC INST_DATA(cl_planefunc.mcc_class,NextObject({cs}))
  2159.  
  2160. /*free(function): This un read-lock all used functions.
  2161. It assumes that freeze(function) has been executed before and that
  2162. function did not change since*/
  2163.  
  2164. PROC free(f:PTR TO function)
  2165. DEF a:PTR TO planeFunc_data,b,c,data:PTR TO projectList_data,obj
  2166.  
  2167.     data:=INST_DATA(cl_projectlist.mcc_class,opened_lst)
  2168.  
  2169.     a,b,c:=f.reference()
  2170.     IF a > 3
  2171.         obj:=a.self
  2172.         set(obj,MUIA_PlaneFunc_Lock,MUIV_PlaneFunc_Lock_NoRead)
  2173.         a:=3
  2174.     ENDIF
  2175.     SELECT a
  2176.     CASE 2 -> One sub-function : "b"
  2177.         free(b)
  2178.     CASE 3 -> Two sub functions : "b" and "c"
  2179.         free(b)
  2180.         free(c)
  2181.     ENDSELECT
  2182. ENDPROC
  2183.  
  2184. /***************************************************************
  2185. **                       main program                         **
  2186. ****************************************************************
  2187.  Opens the libraries, creates the user interface structure and
  2188. notifications. The input loop just waits for MUI to say to quit.
  2189. ***************************************************************/
  2190.  
  2191. PROC main() HANDLE
  2192.     storea4()
  2193.     IF (localebase:=OpenLibrary('locale.library',0)) = NIL THEN
  2194.         Raise('locale.library')
  2195.     NEW cat.create()
  2196.     cat.open()
  2197.     IF (utilitybase:=OpenLibrary('utility.library',36))=NIL THEN
  2198.         Raise('utility.library') /*for tag-list parsing*/
  2199.     muimasterbase:=OpenLibrary(MUIMASTER_NAME,MUIMASTER_VMIN)
  2200.     IF muimasterbase = NIL THEN
  2201.         Raise('muimaster.library')
  2202.     IF (aslbase:=OpenLibrary('asl.library',37))=NIL THEN
  2203.         Raise('asl.library')
  2204.  
  2205.     InitSemaphore(psema)
  2206.  
  2207.     dInit(TRUE)
  2208.     cl_planefunc:=eMui_CreateCustomClass(NIL,MUIC_Area ,NIL,SIZEOF planeFunc_data,{planeFunc_dispatcher})
  2209.     cl_projectlist:=eMui_CreateCustomClass(NIL,MUIC_List,NIL,SIZEOF projectList_data,{projectList_dispatcher})
  2210.     cl_uslider:=eMui_CreateCustomClass(NIL,MUIC_Slider,NIL,SIZEOF uslider_data,{uslider_dispatcher})
  2211.     cl_sizetxt:=eMui_CreateCustomClass(NIL,MUIC_Text,NIL,SIZEOF sizetxt_data,{sizetxt_dispatcher})
  2212.     cl_myapp:=eMui_CreateCustomClass(NIL,MUIC_Application,NIL,SIZEOF empty_data,{myapp_dispatcher})
  2213.     ftype_registertitles:=[cat.msgl_type_Image.getstr(),cat.msgl_type_Function.getstr(),NIL]
  2214.     size_radiolabels:=[cat.msgl_lm_Scale.getstr(),cat.msgl_lm_CutTile.getstr(),cat.msgl_lm_Change.getstr(),NIL]
  2215.     showme_cyclelabels:=[cat.msgl_Hidden.getstr(),cat.msgl_Shown.getstr(),NIL]
  2216.  
  2217.     FOR app:=0 TO 14 -> app: I did not want to create a var just for that loop :-)
  2218.         messages[app]:=String(100)
  2219.     ENDFOR
  2220.  
  2221.     app:=MyApplicationObject,
  2222.         MUIA_Application_Title, 'picFX',
  2223.         MUIA_Application_Version,FULLVERSION,
  2224.         MUIA_Application_Author, 'Maxime Gamboni',
  2225.         MUIA_Application_Description, cat.msg_Description.getstr(),
  2226.         MUIA_Application_Base,'picFX',
  2227.  
  2228.         SubWindow, settings_win:=WindowObject,
  2229.             MUIA_Window_Title, cat.msgl_Title.getstr(),
  2230.             MUIA_Window_ScreenTitle, PICVERSION,
  2231.             MUIA_Window_ID,"SETT",
  2232.             WindowContents,HGroup,
  2233.                 Child, VGroup,
  2234.                     MUIA_Weight,30,
  2235.                     Child, TextObject,
  2236.                         NoFrame,
  2237.                         MUIA_Text_PreParse,'\ec',
  2238.                         MUIA_Text_Contents,cat.msgl_OpenedProjects.getstr(),
  2239.                     End,
  2240.                     Child, opened_lsv:=ListviewObject,
  2241.                         InputListFrame,
  2242.                         MUIA_Listview_List,opened_lst:=ProjectListObject,End,
  2243.                     End,
  2244.                     Child, new_btn:=SimpleButton(cat.msgl_New.getstr()),
  2245.                     Child, RectangleObject,MUIA_Rectangle_HBar,MUI_TRUE,MUIA_Weight,0,End,
  2246.                     Child, prefs_btn:=TextObject,
  2247.                         ButtonFrame,
  2248.                         MUIA_Background,MUII_ButtonBack,
  2249.                         MUIA_Text_PreParse,'\ec',
  2250.                         MUIA_Text_Contents,cat.msgl_Prefs.getstr(),
  2251.                         MUIA_InputMode,MUIV_InputMode_RelVerify,
  2252.                     End,
  2253.                 End,
  2254.                 Child, RectangleObject,MUIA_Rectangle_VBar,MUI_TRUE,MUIA_Weight,0,End,
  2255.                 Child, sgroup:=VGroup,
  2256.                     MUIA_Disabled,MUI_TRUE, -> No projects are opened at beginning
  2257.                     Child,name_str:= StringObject,MUIA_String_Contents,cat.msg_Unnamed.getstr(),StringFrame,End,
  2258.                     Child, type_reg:=RegisterGroup(ftype_registertitles),
  2259.                         Child, VGroup,
  2260.                             Child, HGroup,
  2261.                                 Child, FreeLabel(cat.msgl_Path.getstr()),
  2262.                                 Child, PopaslObject,
  2263.                                     MUIA_Popstring_Button,PopButton(MUII_PopFile),
  2264.                                     MUIA_Popasl_Type,ASL_FILEREQUEST,
  2265.                                     MUIA_Popstring_String,path_str:=StringObject,
  2266.                                         StringFrame,
  2267.                                         MUIA_String_Contents,cat.msg_Unnamed.getstr(),
  2268.                                     End,
  2269.                                 End,
  2270.                             End,
  2271.                             Child, HGroup,
  2272.                                 Child, size_rad:=RadioObject,
  2273.                                     GroupFrameT(cat.msgl_Size.getstr()),
  2274.                                     MUIA_Radio_Entries,size_radiolabels,
  2275.                                     MUIA_Radio_Active,1,
  2276.                                 End,
  2277.                                 Child, VGroup,
  2278.                                     Child, RectangleObject,End,
  2279.                                     Child, size_txt:=SizeTextObject,
  2280.                                         TextFrame,
  2281.                                         MUIA_Text_PreParse,'\ec',
  2282.                                         MUIA_Text_Contents,cat.msgl_PicSize.getstr(),
  2283.                                     End,
  2284.                                     Child, RectangleObject,End,
  2285.                                 End,
  2286.                             End,
  2287.                         End,
  2288.                         Child, VGroup,
  2289.                             Child, HGroup,
  2290.                                 Child,red_fail:=LampObject,
  2291.                                     MUIA_Lamp_Type,MUIV_Lamp_Type_Big,
  2292.                                     MUIA_Lamp_ColorType,MUIV_Lamp_ColorType_UserDefined,
  2293.                                     MUIA_Lamp_Color,MUIV_Lamp_Color_Ok,
  2294.                                 End,
  2295.                                 Child, r_lbl:=label('r(#,x,y)='),
  2296.                                 Child, red_str:=StringObject,
  2297.                                     StringFrame,
  2298.                                 End,
  2299.                             End,
  2300.                             Child, HGroup,
  2301.                                 Child, Label(cat.msgl_Output.getstr()),
  2302.                                 Child, outr_cyc:=CycleObject,
  2303.                                     MUIA_Cycle_Entries,[cat.msgl_Int32.getstr(),cat.msgl_Float32.getstr(),cat.msgl_Float64.getstr(),
  2304.                                                         cat.msgl_OldR.getstr(),cat.msgl_OldG.getstr(),cat.msgl_OldB.getstr(),NIL],
  2305.                                     MUIA_Cycle_Active,3,
  2306.                                 End,
  2307.                                 Child, RectangleObject,End,
  2308.                             End,
  2309.  
  2310.                             Child, HGroup,
  2311.                                 Child,green_fail:=LampObject,
  2312.                                     MUIA_Lamp_Type,MUIV_Lamp_Type_Big,
  2313.                                     MUIA_Lamp_ColorType,MUIV_Lamp_ColorType_UserDefined,
  2314.                                     MUIA_Lamp_Color,MUIV_Lamp_Color_Ok,
  2315.                                 End,
  2316.                                 Child, g_lbl:=label('g(#,x,y)='),
  2317.                                 Child, green_str:=StringObject,
  2318.                                     StringFrame,
  2319.                                 End,
  2320.                             End,
  2321.                             Child, HGroup,
  2322.                                 Child, Label(cat.msgl_Output.getstr()),
  2323.                                 Child, outg_cyc:=CycleObject,
  2324.                                     MUIA_Cycle_Entries,[cat.msgl_Int32.getstr(),cat.msgl_Float32.getstr(),cat.msgl_Float64.getstr(),
  2325.                                                         cat.msgl_OldR.getstr(),cat.msgl_OldG.getstr(),cat.msgl_OldB.getstr(),
  2326.                                                         cat.msgl_CopyR.getstr(),NIL],
  2327.                                     MUIA_Cycle_Active,3,
  2328.                                 End,
  2329.                                 Child, RectangleObject,End,
  2330.                             End,
  2331.  
  2332.                             Child, HGroup,
  2333.                                 Child,blue_fail:=LampObject,
  2334.                                     MUIA_Lamp_Type,MUIV_Lamp_Type_Big,
  2335.                                     MUIA_Lamp_ColorType,MUIV_Lamp_ColorType_UserDefined,
  2336.                                     MUIA_Lamp_Color,MUIV_Lamp_Color_Ok,
  2337.                                 End,
  2338.                                 Child, b_lbl:=label('b(#,x,y)='),
  2339.                                 Child, blue_str:=StringObject,
  2340.                                     StringFrame,
  2341.                                 End,
  2342.                             End,
  2343.                             Child, HGroup,
  2344.                                 Child, Label(cat.msgl_Output.getstr()),
  2345.                                 Child, outb_cyc:=CycleObject,
  2346.                                     MUIA_Cycle_Entries,[cat.msgl_Int32.getstr(),cat.msgl_Float32.getstr(),cat.msgl_Float64.getstr(),
  2347.                                                         cat.msgl_OldR.getstr(),cat.msgl_OldG.getstr(),cat.msgl_OldB.getstr(),
  2348.                                                         cat.msgl_CopyR.getstr(),cat.msgl_CopyG.getstr(),NIL],
  2349.                                     MUIA_Cycle_Active,3,
  2350.                                 End,
  2351.                                 Child, RectangleObject,End,
  2352.                             End,
  2353.                         End,
  2354.                     End,
  2355.                     Child, HGroup,
  2356.                         Child, TextObject,
  2357.                             MUIA_Text_PreParse,'\ec',
  2358.                             MUIA_Text_Contents,cat.msgl_Width.getstr(),
  2359.                         End,
  2360.                         Child, TextObject,
  2361.                             MUIA_Text_PreParse,'\ec',
  2362.                             MUIA_Text_Contents,cat.msgl_Height.getstr(),
  2363.                         End,
  2364.                     End,
  2365.                     Child, HGroup,
  2366.                         Child, width_str:=StringObject,
  2367.                             StringFrame,
  2368.                             MUIA_String_Accept,'0123456789',
  2369.                         End,
  2370.                         Child, height_str:=StringObject,
  2371.                             StringFrame,
  2372.                             MUIA_String_Accept,'0123456789',
  2373.                         End,
  2374.                     End,
  2375.                     Child, GroupObject,MUIA_Group_Rows,2,
  2376.                         Child, draw_btn:=TextObject,
  2377.                             ButtonFrame,
  2378.                             MUIA_Background,MUII_ButtonBack,
  2379.                             MUIA_Text_PreParse,'\ec',
  2380.                             MUIA_Text_Contents,cat.msgl_Render.getstr(),
  2381.                             MUIA_InputMode,MUIV_InputMode_RelVerify,
  2382.                         End,
  2383.                         Child, savepic_btn:=SimpleButton(cat.msgl_SavePic.getstr()),
  2384.                         Child, savefunc_btn:=SimpleButton(cat.msgl_SaveFunc.getstr()),
  2385.                         Child, abort_btn:=SimpleButton(cat.msgl_Abort.getstr()),
  2386.                         Child, showme_cyc:=CycleObject,
  2387.                             ButtonFrame,
  2388.                             MUIA_Cycle_Entries,showme_cyclelabels,
  2389.                             MUIA_Cycle_Active,1,
  2390.                         End,
  2391.                         Child, close_btn:=SimpleButton(cat.msgl_Close.getstr()),
  2392.                         Child, loadfunc_btn:=SimpleButton(cat.msgl_LoadFunc.getstr()),
  2393.                         Child, clear_btn:=SimpleButton(cat.msgl_Clear.getstr()),
  2394.                     End,
  2395.                     Child, HGroup,
  2396.                         Child,lamp_lmp:=LampObject,
  2397.                             MUIA_Lamp_Type,MUIV_Lamp_Type_Big,
  2398.                             MUIA_Lamp_ColorType,MUIV_Lamp_ColorType_UserDefined,
  2399.                             MUIA_Lamp_Color,MUIV_Lamp_Color_Off,
  2400.                         End,
  2401.                         Child,state_txt:=TextObject,
  2402.                             MUIA_Text_Contents,cat.msgs_Idle.getstr(),
  2403.                             MUIA_Weight,50,
  2404.                         End,
  2405.                         Child,state_gau:=GaugeObject,
  2406.                             TextFrame,
  2407.                             MUIA_Gauge_Horiz , MUI_TRUE,
  2408.                         End,
  2409.                     End,
  2410.                 End,
  2411.             End,
  2412.         End,
  2413.         SubWindow,prefs_win:=SettingsWindowObject,
  2414.             MUIA_Window_Title,cat.msgl_Prefs.getstr(),
  2415.             MUIA_Window_ID,"PREF",
  2416.             WindowContents,HGroup,
  2417.                 Child, VGroup,
  2418.                     GroupFrameT(cat.msgp_Priority.getstr()),
  2419.                     Child, mainpri_sld:=uSliderObject,
  2420.                         GroupFrameT(cat.msgp_MainTask.getstr()),
  2421.                         MUIA_Slider_Min,-10,
  2422.                         MUIA_Slider_Max,10,
  2423.                         MUIA_Slider_Level,0,
  2424.                     End,
  2425.                     Child, currpri_sld:=uSliderObject,
  2426.                         GroupFrameT(cat.msgp_CurrentTask.getstr()),
  2427.                         MUIA_Slider_Min,-10,
  2428.                         MUIA_Slider_Max,10,
  2429.                         MUIA_Slider_Level,-1,
  2430.                     End,
  2431.                     Child, renderpri_sld:=uSliderObject,
  2432.                         GroupFrameT(cat.msgp_RenderTask.getstr()),
  2433.                         MUIA_Slider_Min,-10,
  2434.                         MUIA_Slider_Max,10,
  2435.                         MUIA_Slider_Level,-2,
  2436.                     End,
  2437.                 End,
  2438.                 Child, VGroup,
  2439.                     Child, renderupdate_sld:=uSliderObject,
  2440.                         GroupFrameT(cat.msgp_RenderUpd.getstr()),
  2441.                         MUIA_uSlider_Stringify,MUI_TRUE,
  2442.                         MUIA_Slider_Min,0,
  2443.                         MUIA_Slider_Max,40,
  2444.                         MUIA_Slider_Level,10,
  2445.                     End,
  2446.                     Child, HGroup,
  2447.                         Child, FreeLabel(cat.msgp_Close.getstr()),
  2448.                         Child, close_cyc:=CycleObject,
  2449.                             MUIA_Cycle_Entries,[cat.msgl_Iconify.getstr(),cat.msgl_Close.getstr(),NIL],
  2450.                             MUIA_Cycle_Active,0,
  2451.                         End,
  2452.                     End,
  2453.                     Child, mui_btn:=SimpleButton(cat.msgp_MuiPrefs.getstr()),
  2454.                 End,
  2455.             End,
  2456.         End,
  2457.         SubWindow,messages_win:=WindowObject,
  2458.             MUIA_Window_Title,cat.msgm_NoMsg.getstr(),
  2459.             MUIA_Window_ID,"MESS",
  2460.             WindowContents,VGroup,
  2461.                 Child,ListviewObject,
  2462.                     MUIA_Listview_Input,FALSE,
  2463.                     ReadListFrame,
  2464.                     MUIA_Listview_List,messages_lst:=ListObject,
  2465.                         MUIA_List_SourceArray,messages,
  2466.                     End,
  2467.                 End,
  2468.                 Child, colour_txt:=TextObject,
  2469.                     TextFrame,
  2470.                     MUIA_Background,MUII_TextBack,
  2471.                     MUIA_Text_Contents,'c(p,x,y)=[r,g,b]',
  2472.                 End,
  2473.             End,
  2474.         End,
  2475.     End
  2476.     IF app <> NIL
  2477.         set(settings_win,MUIA_Window_DefaultObject,opened_lsv)
  2478.  
  2479.         doMethodA(settings_win,[MUIM_Notify,MUIA_Window_CloseRequest,MUI_TRUE,app,2,MUIM_Application_ReturnID,MUIV_Application_ReturnID_Quit])
  2480.         doMethodA(new_btn,     [MUIM_Notify,MUIA_Pressed,FALSE,opened_lst,1,MUIM_ProjectList_NewItem])
  2481. /*preferences*/
  2482.         doMethodA(prefs_btn,   [MUIM_Notify,MUIA_Pressed,FALSE,prefs_win,3,MUIM_Set,MUIA_Window_Open,MUI_TRUE])
  2483.         doMethodA(mui_btn,     [MUIM_Notify,MUIA_Pressed,FALSE,app,1,MUIM_Application_OpenConfigWindow])
  2484.  
  2485.         doMethodA(prefs_win,   [MUIM_SettingsWindow_Notify,SETID_MainP,  MUIV_EveryTime,opened_lst,3,MUIM_ProjectList_SetPri,MUIV_ProjectList_SetPri_Main,MUIV_TriggerValue])
  2486.         doMethodA(prefs_win,   [MUIM_SettingsWindow_Notify,SETID_RenderP,MUIV_EveryTime,opened_lst,3,MUIM_ProjectList_SetPri,MUIV_ProjectList_SetPri_Render,MUIV_TriggerValue])
  2487.         doMethodA(prefs_win,   [MUIM_SettingsWindow_Notify,SETID_CurrP,  MUIV_EveryTime,opened_lst,3,MUIM_ProjectList_SetPri,MUIV_ProjectList_SetPri_Curr,MUIV_TriggerValue])
  2488.         doMethodA(prefs_win,   [MUIM_SettingsWindow_Notify,SETID_RUpd,   MUIV_EveryTime,opened_lst,3,MUIM_ProjectList_Prefs,{rupd},MUIV_TriggerValue])
  2489.         doMethodA(prefs_win,   [MUIM_SettingsWindow_Notify,SETID_Close,  MUIV_EveryTime,app,3,MUIM_WriteLong,MUIV_TriggerValue,{wclose}])
  2490.         doMethodA(prefs_win,[MUIM_SettingsWindow_Init,
  2491.             mainpri_sld,     MUIA_Slider_Level,SWIT_STANDARD,0,SETID_MainP,
  2492.             renderpri_sld,   MUIA_Slider_Level,SWIT_STANDARD,0,SETID_RenderP,
  2493.             currpri_sld,     MUIA_Slider_Level,SWIT_STANDARD,0,SETID_CurrP,
  2494.             renderupdate_sld,MUIA_Slider_Level,SWIT_STANDARD,0,SETID_RUpd,
  2495.             close_cyc,       MUIA_Cycle_Active,SWIT_STANDARD,0,SETID_Close,
  2496.             NIL])
  2497.  
  2498. /*mainpri >= currpri >= renderpri*/
  2499.         doMethodA(mainpri_sld,[MUIM_Notify,MUIA_Slider_Level,MUIV_EveryTime,currpri_sld,2,MUIM_uSlider_Smaller,MUIV_TriggerValue])
  2500.         doMethodA(mainpri_sld,[MUIM_Notify,MUIA_Slider_Level,MUIV_EveryTime,renderpri_sld,2,MUIM_uSlider_Smaller,MUIV_TriggerValue])
  2501.  
  2502.         doMethodA(currpri_sld,[MUIM_Notify,MUIA_Slider_Level,MUIV_EveryTime,renderpri_sld,2,MUIM_uSlider_Smaller,MUIV_TriggerValue])
  2503.         doMethodA(currpri_sld,[MUIM_Notify,MUIA_Slider_Level,MUIV_EveryTime,mainpri_sld,2,MUIM_uSlider_Bigger,MUIV_TriggerValue])
  2504.  
  2505.         doMethodA(renderpri_sld,[MUIM_Notify,MUIA_Slider_Level,MUIV_EveryTime,mainpri_sld,2,MUIM_uSlider_Bigger,MUIV_TriggerValue])
  2506.         doMethodA(renderpri_sld,[MUIM_Notify,MUIA_Slider_Level,MUIV_EveryTime,currpri_sld,2,MUIM_uSlider_Bigger,MUIV_TriggerValue])
  2507.  
  2508. /*Every change to a gadget is sent to the ProjectList class*/
  2509.         doMethodA(name_str,    [MUIM_Notify,MUIA_String_Contents,MUIV_EveryTime,opened_lst,3,MUIM_ProjectList_Notify,MUIV_ProjectList_Notify_Name,MUIV_TriggerValue])
  2510.         doMethodA(type_reg,    [MUIM_Notify,MUIA_Group_ActivePage,MUIV_EveryTime,opened_lst,3,MUIM_ProjectList_Notify,MUIV_ProjectList_Notify_Type,MUIV_TriggerValue])
  2511.         doMethodA(path_str,    [MUIM_Notify,MUIA_String_Contents,MUIV_EveryTime,opened_lst,3,MUIM_ProjectList_Notify,MUIV_ProjectList_Notify_ImageFile,MUIV_TriggerValue])
  2512.         doMethodA(size_rad,    [MUIM_Notify,MUIA_Radio_Active,MUIV_EveryTime,opened_lst,3,MUIM_ProjectList_Notify,MUIV_ProjectList_Notify_LoadM,MUIV_TriggerValue])
  2513.         doMethodA(red_str,     [MUIM_Notify,MUIA_String_Acknowledge,MUIV_EveryTime,opened_lst,3,MUIM_ProjectList_Notify,MUIV_ProjectList_Notify_Red,MUIV_TriggerValue])
  2514.         doMethodA(green_str,   [MUIM_Notify,MUIA_String_Acknowledge,MUIV_EveryTime,opened_lst,3,MUIM_ProjectList_Notify,MUIV_ProjectList_Notify_Green,MUIV_TriggerValue])
  2515.         doMethodA(blue_str,    [MUIM_Notify,MUIA_String_Acknowledge,MUIV_EveryTime,opened_lst,3,MUIM_ProjectList_Notify,MUIV_ProjectList_Notify_Blue,MUIV_TriggerValue])
  2516.         doMethodA(outr_cyc,    [MUIM_Notify,MUIA_Cycle_Active,MUIV_EveryTime,opened_lst,3,MUIM_ProjectList_Notify,MUIV_ProjectList_Notify_OutputR,MUIV_TriggerValue])
  2517.         doMethodA(outg_cyc,    [MUIM_Notify,MUIA_Cycle_Active,MUIV_EveryTime,opened_lst,3,MUIM_ProjectList_Notify,MUIV_ProjectList_Notify_OutputG,MUIV_TriggerValue])
  2518.         doMethodA(outb_cyc,    [MUIM_Notify,MUIA_Cycle_Active,MUIV_EveryTime,opened_lst,3,MUIM_ProjectList_Notify,MUIV_ProjectList_Notify_OutputB,MUIV_TriggerValue])
  2519.         doMethodA(width_str,   [MUIM_Notify,MUIA_String_Acknowledge,MUIV_EveryTime,opened_lst,3,MUIM_ProjectList_Notify,MUIV_ProjectList_Notify_Width,MUIV_TriggerValue])
  2520.         doMethodA(height_str,  [MUIM_Notify,MUIA_String_Acknowledge,MUIV_EveryTime,opened_lst,3,MUIM_ProjectList_Notify,MUIV_ProjectList_Notify_Height,MUIV_TriggerValue])
  2521. /*If the active element of the Opened Projects List has changed, the gadgets must be refreshed*/
  2522.         doMethodA(opened_lst,  [MUIM_Notify,MUIA_List_Active,MUIV_EveryTime,opened_lst,1,MUIM_ProjectList_Refresh,0])
  2523. /*Action buttons:ProjectList class will forward those messages to the selected project*/
  2524.         doMethodA(draw_btn,    [MUIM_Notify,MUIA_Pressed,FALSE,opened_lst,2,MUIM_ProjectList_Forward,MUIM_PlaneFunc_Render])
  2525.         doMethodA(savepic_btn, [MUIM_Notify,MUIA_Pressed,FALSE,opened_lst,2,MUIM_ProjectList_Forward,MUIM_PlaneFunc_SavePic])
  2526.         doMethodA(savefunc_btn,[MUIM_Notify,MUIA_Pressed,FALSE,opened_lst,2,MUIM_ProjectList_Forward,MUIM_PlaneFunc_SaveFunc])
  2527.         doMethodA(loadfunc_btn,[MUIM_Notify,MUIA_Pressed,FALSE,opened_lst,2,MUIM_ProjectList_Forward,MUIM_PlaneFunc_LoadFunc])
  2528.         doMethodA(abort_btn,   [MUIM_Notify,MUIA_Pressed,FALSE,opened_lst,2,MUIM_ProjectList_Forward,MUIM_PlaneFunc_Abort])
  2529.         doMethodA(clear_btn,   [MUIM_Notify,MUIA_Pressed,FALSE,opened_lst,2,MUIM_ProjectList_Forward,MUIM_PlaneFunc_Clear])
  2530. /*since the address of the current project is variable I can't do direct notification. Instead, there are two methods for ProjectList.*/
  2531.         doMethodA(opened_lsv,  [MUIM_Notify,MUIA_Listview_DoubleClick,MUI_TRUE,showme_cyc,3,MUIM_Set,MUIA_Cycle_Active,1])
  2532.         doMethodA(showme_cyc,  [MUIM_Notify,MUIA_Cycle_Active,MUIV_EveryTime,opened_lst,2,MUIM_ProjectList_ShowMe,MUIV_TriggerValue])
  2533.         doMethodA(close_btn,   [MUIM_Notify,MUIA_Pressed,FALSE,opened_lst,1,MUIM_ProjectList_DelItem])
  2534.  
  2535.         set(settings_win,MUIA_Window_Open,MUI_TRUE)
  2536.         set(messages_win,MUIA_Window_Open,MUI_TRUE)
  2537.  
  2538.         message(-1,cat.msgm_Welcome.getstr())
  2539.  
  2540.         WHILE Not(doMethodA(app,[MUIM_Application_NewInput,{sigs}]) = MUIV_Application_ReturnID_Quit)
  2541.             IF sigs THEN sigs := Wait(sigs)
  2542.         ENDWHILE
  2543.  
  2544.     ELSE
  2545.         WriteF(cat.msg_NoApp.getstr())
  2546.     ENDIF
  2547. EXCEPT DO
  2548.     IF app THEN Mui_DisposeObject(app)
  2549.     IF cl_planefunc THEN Mui_DeleteCustomClass(cl_planefunc)
  2550.     IF cl_projectlist THEN Mui_DeleteCustomClass(cl_projectlist)
  2551.     IF cl_uslider THEN Mui_DeleteCustomClass(cl_uslider)
  2552.     IF cl_sizetxt THEN Mui_DeleteCustomClass(cl_sizetxt)
  2553.     IF cl_myapp THEN Mui_DeleteCustomClass(cl_myapp)
  2554.     dCleanup()
  2555.     cleanfuncs()
  2556.     IF exception
  2557.         IF localebase
  2558.             WriteF(cat.msg_Nolib.getstr(),exception)
  2559.         ELSE
  2560.             WriteF('Failed to open \s.\n',exception)
  2561.         ENDIF
  2562.     ENDIF
  2563.     IF muimasterbase THEN CloseLibrary(muimasterbase)
  2564.     IF utilitybase   THEN CloseLibrary(utilitybase)
  2565.     IF cybergfxbase  THEN CloseLibrary(cybergfxbase)
  2566.     IF pi96base      THEN CloseLibrary(pi96base)
  2567.     cat.close()
  2568.     IF localebase THEN CloseLibrary(localebase)
  2569. ENDPROC                     
  2570.  
  2571. PROC message(id,info:PTR TO CHAR) -> Writes a message in the message-list
  2572. DEF t
  2573.     FOR t:=0 TO 13
  2574.         StrCopy(messages[t],messages[t+1]) -> Warning, the addresses mustn't change!
  2575.     ENDFOR
  2576.     StringF(messages[14],'[\d] \s',id,info)
  2577.     doMethodA(messages_lst,[MUIM_List_Redraw,MUIV_List_Redraw_All])
  2578.     StringF(title,'\d Message\c',counter++,-(counter<>2)*"s")     /*I will have to localize this, too!*/
  2579.     set(messages_win,MUIA_Window_Title,title)
  2580. ENDPROC
  2581.  
  2582. PROC messagefmt(id,info:PTR TO CHAR,arg1=0,arg2=0,arg3=0)
  2583. DEF s[100]:STRING
  2584.     StringF(s,info,arg1,arg2,arg3)
  2585.     message(id,s)
  2586. ENDPROC
  2587.  
  2588. /* geta4.e © Leon Woestenberg */
  2589.  
  2590. PROC storea4()
  2591.   LEA a4storage(PC),A0
  2592.   MOVE.L A4,(A0)
  2593. ENDPROC
  2594.  
  2595. PROC geta4()
  2596.   LEA a4storage(PC),A0
  2597.   MOVE.L (A0),A4
  2598. ENDPROC
  2599.  
  2600. a4storage:
  2601.   LONG NIL                 
  2602.